shell提供了用来控制程序执行流程的命令,包括条件、分支和循环结构,可以用这些命令建立非常复杂的程序。
应该注意的是,shell中用于指定条件值的不是布尔表达式,而是命令和字符串。
1。test测试命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件3个方面的测试。
数值测试:
· -eq 等于则为真
· -ne 不等于则为真
· -gt 大于则为真
· -ge 大于等于则为真
· -lt 小于则为真
· -le 小于等于则为真
字符串测试:
· = 等于则为真
· != 不相等则为真
· -z 字符串 字符串长度为零则为真
· -n 字符串 字符串长度不为零则为真
文件测试:
· -e 文件名 如果文件存在则为真。-exist
· -r 文件名 如果文件存在且可读则为真。-read
· -w 文件名 如果文件存在且可写则为真。-write
· -x 文件名 如果文件存在且可执行则为真。-execute
· -s 文件名 如果文件存在且至少有一个字符则为真。<不常用>
· -d 文件名 如果文件存在且为目录则为真。-directory
· -f 文件名 如果文件存在且为普通文件则为真。-file
· -c 文件名 如果文件存在且为字符特殊文件则为真。-char<不常用>
· -b 文件名 如果文件存在且为块特殊文件则为真。-block<不常用>
另外,Linux还提供了与(!)、或(-o)、非(-a)3个逻辑操作符用于将测试条件连接起来。
其优先级顺序为:与(!)最高、非(-a)次之、或(-o)最低。
同时,bash也能完成简单的算术运算,格式为:$[表达式]
2。if条件语句
if 条件命令串1
then
条件1为真时的命令串
elif 条件命令串2
then
条件2为真时的命令串
…
else
所有条件为假时的命令串
fi
3。for循环
for 变量名
[in 数值列表]
do
若干命令组成的命令列表
done
4。while和until循环
while/until
若干个命令行1
do
若干个命令行2
done
判定条件:“若干个命令行1”中最后一个命令的返回状态(真或假)。
while和until循环的区别:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。
shell还提供了true和false两条命令用于建立无限循环结构,它们的返回状态分别是总为0或总为非0。
5。case条件选择
case string in
exp-1)
若干个命令行1
;;
exp-2)
若干个命令行2
;;
…
*)
其它命令行
esac
在case表达式中可以使用shell的通配符。
6。break和continue
break和continue是无条件控制语句,break用于立即终止当前循环的执行,而continue用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。
7。函数定义
shell中还可以定义函数。函数定义的基本形式如下:
functionname
{
若干命令行
}
调用函数的格式如下:
functionname param1 param2 …
shell函数可以完成某些例行工作,而且还可以有自己的退出状态,因此函数也可以作为if、while等控制结构的条件。
在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时shell将把这些参数分别赋予相应位置的位置参数$1、$2等。
8。命令分组
在shell中有两种命令分组的方法:“()”和“{}”。前者当shell执行“()”中的命令时将再创建一个新的进程,然 后这个子进程去执行“()”中的命令。当用户在执行某个命令时,为了不让状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行, 仅应该把这些命令放在“()”中,这样能保证所有的改变只对子进程产生影响,而父进程不受任何干扰。“{}”用于将顺序执行的命令的输出结果用于另一个命 令的输入(管道方式)。当用户要真正使用“()”和“{}”时(如计算表达式的优先级),则需要在其前面加上转义字符(/),比便让shell知道它们不 是用于命令执行控制。
trap命令用于在shell程序中捕捉信号,之后可以有3种反应方式:
· 执行一段程序来处理这一信号。
· 接受信号的默认操作。
· 忽视这一信号。
trap对上面3种方式相应提供了3种基本形式:
·第一种形式的trap命令在shell接收到signal-list清单中数值相同的信号时,将执行引号中的命令串:
trap 'commands' signal-list
trap "commands" signal-list
·为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
·第三种形式的trap命令允许忽视信号:
trap " " signal-list
注 意:在trap语句中,单引号和双引号是不同的。当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若 commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当前具体 的值来替换。