第十章 Sh编程
10.1 sh脚本:
1.sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。
2.sh脚本与C程序
C程序必须先编译链接到一个二进制可执行文件,再通过主sh的子进程运行该二进制可执行文件;sh则可直接执行行命令。
sh脚本不需要main函数。
10.2 sh脚本与C程序
两者虽然部分相似,但根本上是不同的
1.sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行,而c程序必须先编译链接到一个二进制可执行文件,然后在通过主sh的子进程运行二进制可执行文件;
2.sh脚本的每个变量都是字符串,因此不需要变量,而c程序中每个变量都必须有一个类型,包括char、int、float等等;
3.sh脚本不需要main函数,第一个可执行语句是程序的入口,而c程序必须有main()函数。
10.3 命令行参数
$#=命令行参数S1到Sn 的数量
$*=所有命令行参数,包括$0
此外,sh 还有与命令执行相关的以下内置变量。
$S=执行 sh的进程PID
$?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
sh中,特殊字符$表示替换,要原样使用的话必须带有单引号或反引号\,例如$
10.4 sh标准
(1)sh定义的环境变量
sh在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义,常用的sh环境变量有:
HOME:用于保存注册目录的完全路径名。
PATH:用于保存用冒号分隔的目录路径名,sh将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。
TERM:终端的类型。
UID:当前用户的标识符,取值是由数字构成的字符串。
PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
PS1:主提示符,在特权用户下,缺省的主提示符是“#”,在普通用户下,缺省的主提示符是“$”。
PS2:在sh接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时sh判断出用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,缺省的辅助提示符是“>”。
(2)用户定义的变量
用户可以按照下面的语法规则定义自己的变量: 变量名=变量值
要注意的一点是,在定义变量时,变量名前不应加符号“$”,在引用变量的内容时则应在变量名前加“$”;
在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来。 在编写sh程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示。 有时我们想要在说明一个变量并对它设定为一个特定值后就不在改变它的值,这可以用下面的命令来保证一个变量的只读性:
readly 变量名
在任何时候,建立的变量都只是当前sh的局部变量,所以不能被sh运行的其他命令或sh程序所利用,export命令可以将一局部变量提供给sh执行的其他命令使用,其格式为:
export 变量名
也可以在给变量赋值的同时使用export命令: export 变量名=变量值
使用export说明的变量,在sh以后运行的所有命令或程序中都可以访问到。
2.参数置换的变量
sh提供了参数置换能力以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能分别如下:
(1)变量=${参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
(2)变量=${参数=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在sh程序中不能为位置参数赋值。
(3)变量=${参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从sh中退出,如果省略了word,则显示标准信息。这种变量要求一定等于某一个参数的值,如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
(4)变量=${参数+word}:如果设置了参数,则用word置换变量,否则不进行置换。 所有这四种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。
10.5 命令
10.5.1 sh 命令
sh包括许多内置命令,不需要创建新进程,一些常用的如下:
file∶读取并执行文件。
● break 【n】∶从最近的第n个嵌套循环中退出。
● cd 【dirname】∶更换目录。
● continue 【n】∶重启最近的第n个嵌套循环。
● eval 【ar …】∶计算一次参数并让 sh执行生成的命令。
● exec 【arg …】∶通过这个sh执行命令,sh将会退出。
● exit 【n】∶使sh退出,退出状态为 n。
● export 【va …】∶将变量导出到随后执行的命令。
● read 【var …】∶从 stdin中读取一行并为变量赋值。
● set 【arg …】∶在执行环境中设置变量。·
● shift∶将位置参数$2 $3…重命名为$1$2…。
● trap 【arg】【n】∶接收到信号n后执行参数。
● umask【ddd】∶将掩码设置为八进制数 ddd 的。
● wait【pid】∶等待进程 pid,如果没有给出 pid,则等待所有活动子进程。
10.9sh控制语句
1.if条件语句
sh程序中的条件分支是通过if条件语句来实现的,其一般格式为:
if 条件命令串 then
条件为真时的命令串
else
条件为假时的命令串
fi
2.for 循环
for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:
for 变量名 [in 数值列表]
do
若干个命令行
done
变量名可以是用户选择的任何字符串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。
3.while和until 循环
while 和 until命令都是用命令的返回状态值来控制循环的。
While 循环的一般格式为:
while
若干个命令行1
do 若干个命令行2
done
只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行do...done之间的“若干个命令行2”。
until命令是另一种循环结构,它和while命令相似,其格式如下:
until 若干个命令行1
do
若干个命令行2
done
until循环和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。
sh还提供了true和false两条命令用于建立无限循环结构的需要,它们的返回状态分别是总为0或总为非0
一门程序设计语言有哪些必备的要素和技能?
1,深入并且专注于一种编程语言
2.程序设计语言、程序、编辑、源程序、编译、可执行程序、运行
3.掌握程序中最基本的语法、运算、基本功能。
4.多练习各个分块的学习内容,勤练 多问!