sh编程
一、sh脚本与C程序
- C程序必须先编译链接到一个二进制可执行文件,再通过主sh的子进程运行该二进制可执行文件;sh则可直接执行行命令。
- sh脚本不需要main函数。
二、编写sh脚本
shell的基本语法主要就是如何输入命令运行程序以及如何在程序之间通过shell的一些参数提供便利手段来进行通讯。
1.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置换变量,否则不进行置换。 所有这四种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较多。
三、sh控制语句
1.test测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:
(1)数值测试:
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
(2)字符串测试:
=:等于则为真
!=:不相等则为真
-z 字符串:字符串长度伪则为真
-n 字符串:字符串长度不伪则为真
(3)文件测试:
-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真
另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。 同时,bash也能完成简单的算术运算,格式如下:
$[expression]
例如:var1=2 var2=$[var1*10+1] 则:var2的值为21。
2.if条件语句
sh程序中的条件分支是通过if条件语句来实现的,其一般格式为:
if 条件命令串 then
条件为真时的命令串
else
条件为假时的命令串
fi
3.for 循环
for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:
for 变量名 [in 数值列表]
do
若干个命令行
done
变量名可以是用户选择的任何字符串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。
4.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
5.case 条件选择
if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其格式如下:
case string in
exp-1) 若干个命令行1 ;;
exp-2) 若干个命令行2 ;;
sh通过计算字符串string的值,将其结果依次和表达式exp-1、exp-2等进行比较,直到找到一个匹配的表达式为止,如果找到了匹配项则执行它下面的命令直到遇到一对分号(;;)为止。
在case表达式中也可以使用shell的通配符(“”、“?”、“[ ]”)。通常用“”作为case命令的最后表达式以便使在前面找不到任何相应的匹配项时执行“其他命令行”的命令。