知识点归纳
这一章的主要内容包含了sh编程的绝大部分内容。但是在此之前,还是要强调一下诸如Python、C、Java这些程序语言的特点。
1.Python
(一)Python是什么 ?
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,更多被用于独立的、大型项目的开发。很多高校和大专院校的计算机课程均采用Python作为入门语言。
(二)Python的优点
1.简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。
2.易学:Python极其容易上手,因为Python有极其简单的说明文档。
3.速度快:Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快。
4.高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
5.可移植性:由于它的开源本质,Python已经被移植在许多平台上。这些平台包括Linux、Windows以及Google基于linux开发的android平台等。
6.丰富的库:Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器等。
7.规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。
(三)Python的缺点
1.独特的语法:它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。
2.运行速度慢:这里是指与C和C++相比。
(四)Python 可以做什么?
1.系统编程:提供API(Application Programming Interface应用程序编程接口),能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。
2.图形处理:能方便进行图形处理。
3.数值计算:NumPy扩展提供大量与许多标准数学库的接口。
4.文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。
5.数据库编程:程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。
6.应用程序:编写带用户界面的应用程序。
7.网络:编写网站、爬虫等。
8.多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。
原文链接:https://blog.csdn.net/wzhrsh/article/details/109225637
2.C语言
C是一种通用的编程语言,广泛用于系统软件与应用软件的开发。于1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇与肯·汤普逊,以B语言为基础,在贝尔实验室设计、开发出来。
C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序员中备受青睐,成为最近25年使用最为广泛的编程语言。目前,C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows, Mac OS X, Linux, Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。二十世纪八十年代至今的有关程序开发工具,一般都支持匹配ANSI C的语法。
3.Java
java语言概述
java是SUN(斯坦福大学网络公司)1995年推出的一门高级编程语言。
是一种面向Internet的编程语言。
这些本不是本章的主要内容,但都脱离不开基础语言,尤其是C语言,因为本章的主要内容其实是shell编程。不同于其他的高级编程语言,sh的功能不是针对于目标本身而编译的代码,而是服务于其他高级编程语言。
4.Shell编程
1.sh脚本
sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。例如,我们可以创建一个文本文件mysh
#!/bin/bash
# comment line
echo he11o
使用chmod+xmysh使其可执行。然后运行mysh。sh脚本的第一行通常以#!组合开始,通常称为shebang。当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。sh有许多不同的版本,例如Linux的bashBSDUnix的csh和IBMAX的ksh等。所有sh程序基本上都执行相同的任务,但它们的脚本在语法上略有不同。shebang允许主sh调用适当版本的sh来执行脚本。如果未指定shebang,它将运行默认的sh,即Linux中的/bin/bash。当bash执行mysh脚本时,将会打印hello。
sh脚本和C程序有一些相似之处,但它们在根本上是不同的。他们的不同主要表现在以下几个方面:
(1)sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。而C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。
(2)在C程序中,每个变量必须有一个类型,例如char、int、float、派生类型(如struct)等。相反,在sh脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。
(3)每个C程序必须有一个main()函数,每个函数必须定义一个返回值类型和参数(如有)。相反,sh脚本不需要main函数。在sh脚本中,第一个可执行语句是程序的入口点。
2.命令行参数
可使用与运行sh命令完全相同的参数调用sh脚本,在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前10个命令行参数可以作为$0-$9被访问。其他参数必须称为$(10)-$(n),其中n>10。或者,可以通过稍后显示的shift命令查看它们。通常,$0是程序名本身,$1到$是程序的参数。在sh中,可用内置变量$#和$计数并显示命令行参数。
$#=命令行参数$1到$n的数量
$=所有命令行参数,包括$0
此外,sh还有与命令执行相关的以下内置变量。
$S=执行sh的进程PID
$?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
3.sh变量
sh有许多内置变量,如PATH、HOME TERM等。除了内置变量外,用户还可使用任何符号作为sh变量。不需要声明。所有的sh变量值都是字符串。未赋值的sh变量是NULL字符串。sh变量可用以下方法设置或赋值:“variable=string”如果A是一个变量,则$A是变量的值。
4.sh中的引号
sh有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用\或单引号来引用它们。通常,\用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。
5.sh语句
sh语句包括所有Unix/Linux命令,以及可能的I/0重定向。此外,sh编程语言还支持sh程序执行的测试条件、循环、case等语句。
6.sh命令
(1)内置命令
sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程。下面列出一些常用的内置sh命令。
.file:读取并执行文件。
break[n]:从最近的第n个嵌套循环中退出
cd[dirname]:更换目录
continue[n]:重启最近的第n个嵌套循环
eval[arg...]:计算一次参数并让sh执行生成的命令
exec[arg...]:通过这个sh执行命令,sh将会退出
exit[n]:使sh退出,退出状态为n
export[var...]:将变量导出到随后执行的命令
read[var...]:从stdin中读取一行并为变量赋值
set [arg...]:在执行环境中设置变量
shift:将位置参数$2 $3...重命名为$1 $2....
trap[arg][n]:接收到信号n后执行参数
umask[ddd]:将掩码设置为八进制数ddd的
wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。
read命令:当sh执行read命令时,它会等待来自stdin的输人行。它将输入行划分为几个标记,分配给列出的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。
(2)Linux命令
sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分,因为它们广泛用于sh脚本中。主要有以下命令:
echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。
awk:数据处理程序
cmp:比较两个文件
comm:选择两个排序文件共有的行
grep:匹配一系列文件的模式
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件
sed:流或行编辑命令
sort:排序或合并文件
tail:打印某个文件的最后n行
tr:一对一字符翻译
uniq:从文件中删除连续重复行
7.命令替换
在sh中,$A会被替换成A值。同样,当sh遇到'cmd'(用引号括起来)或$(cmd)时,它会先执行cmd,然后用执行的结果字符串替换$(cmd)。
8.sh控制语句
(1)1if-else-fi语句
if-else-fi语句的语法是:
if [ condition ]
then
statements
e1se
statements
fi
每个语句必须在单独的一行上。但是,如果多个语句之间用分号分开,则sh允许多个语句在同一行
(2)for语句
for VARIABLE in string1 string2....stringr
do
commandsdone`
在每次迭代中,变量接受一个参数字符串值,并执行关键字do和done之间的命令。
(3)while语句
sh的while语句类似于C语言中的while循环
while [ condition ]
do
commands
done
当条件为真时,sh将重复执行do-done关键字中的命令。预计条件会有变化,所以循环将在某个时间点退出。
(4)until-do语句
该语句类似于C语言中的do-until语句。
until[ $ANS="give up"]
do
echo -n "enter your answer:"
read ANS
done
(5)case 语句
case $variable in
pattern1) command;;
pattern2) command;;
patternN) command;;
esac
9.I/O重定向
当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件。I/O重定向有以下形式和含义:
file:stdout转向文件,如果文件不存在 将会创建文件。
file:stdout追加到文件。
<file:将文件用作stdin;文件必须存在并 具有r权限。
<<word:从“here”文件中获取输人,直到只包含“word”的行。
10.sh函数
sh函数的定义为:
func()
{
function code
}
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。在sh脚本中无法声明函数原型。sh函数的调用方式与sh脚本文件的执行方式完全相同。sh语句fune s1s2... sn调用sh函数,以参数(字符串)形式传递s1~sn。在被调函数中,参数被引用为$0、$1到$n。通常,$0是函数名,$1到$n是与命令行参数对应的位置参数。函数执行结束时,S?表示其退出状态,如果成功,状态为0,否则,状态为非0。$?值可用函数的显式返回值进行更改。
11.sh中的通配符
星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件。
?通配符:查询某文件名中的字符示例10.15:
[]通配符:查询文件名中一对[]中的字符。
最有收获的内容
学任何东西,都要知道这个知识的目的和优点。Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作。比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统的ping命令呢?通常在程序中通过 system函数来调用shell命令。但是,system函数仅返回命令是否执行成功,而我们可能需要获得shell命令在控制台上输出的结果。例如,执行外部命令ping后,如果执行失败,我们希望得到ping的返回信息。
shell是个脚本语言,也是应用程序与内核进行交互的桥梁(一个让开发者与内核交互的软件)。
比如我们计算机的运行状态等我们是无法肉眼来查看的,但是通过shell我们就能看到他的数据,其他一些应用程序,比如浏览器、音乐播放器等获得内核所掌管的音频、显卡等驱动的帮助。
shell也是个脚本语言,我们可以将一系列的操作放入一个文件中,并给予这个文件可执行的权限,我们就可以一下运行文件中的所有的指令,比如我们有一系列的操作经常使用,但是一个一个的打是在太麻烦了,我们可以将他写到一个脚本中,只需一次运行所有的操作就完成了。而C语言是另一种高级的计算机语言,他可以开发很多软件,其实shell也是用c写的。脚本语言是为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言。此命名起源于一个脚本,每次运行都会使对话框逐字重复。早期的脚本语言经常被称为批处理语言或工作控制语言。一个脚本通常是解释运行而非编译。虽然许多脚本语言都超越了计算机简单任务自动化的领域,成熟到可以编写精巧的程序,但仍然还是被称为脚本。几乎所有计算机系统的各个层次都有一种脚本语言。包括操作系统层,如计算机游戏,网络应用程序,文字处理文档,网络软件等。在许多方面,高级编程语言和脚本语言之间互相交叉,二者之间没有明确的界限。一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个Shell脚本主要由原本需要在命令行输入的命令组成,或在一个文本编辑器中,用户可以使用脚本来把一些常用的操作组合成一组序列。主要用来书写这种脚本的语言叫做脚本语言。很多脚本语言实际上已经超过简单的用户命令序列的指令,还可以编写更复杂的程序。
问题
shell中的switch/case语句与C语言中的区别是什么?
解决思路
后来通过查阅资料才知道,其实在shell中就没有switch/case语句。不过case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。大家看到我的第一个例子就是通过break语句直接跳出while循环。