Linux操作系统实用教程:shell程序控制结构语句
shell程序控制结构语句
脚本的控制结构语句有三种基本的类型:两路分支、多路分支以及一个或多个命令的循环执行。Linux的bash中的两路分支语句是if语句,多路分支语句是if-elif和case语句;代码的循环执行语句是for、while和until语句。
if语句
两路分支的if语句 格式:
if 判断条件
then 命令1
else 命令2
Fi
判断条件包括命令语句和测试语句两种方式:
命令语句形式的判断条件
多路条件判断分支的if语句
格式为:
if 判断条件1
then 命令1
elif 判断条件2
then 命令2
……
else 命令n
Fi
其中elif是else if的缩写
测试语句
有两种格式,一种是使用关键字test,而另一种是使用方括号。格式如下:
test expression
[ expression ]
二者是等效的。同时要注意几点
用于三种形式的测试:文件测试、字符串测试和数值测试
文件测试
字符串测试
数值测试
用逻辑操作符进行组合的测试语句
用逻辑操作符进行组合的测试语句实例
[ ! "$s1" -le 0 ]
! test "$s1" -le 0
[ -f "$s1" –a –w "$s1" ]
test –f "$s1" -a –w "$s1"
[ "$s1" –gt 0 –o "$s2" –lt 10 ]
test "$s1" –gt 0 –o "$s2" –lt 10
[ \( "$a" –gt 0 –a "$a" –lt 10 \) –a "$a" –ne 5 ]
test \( "$a" –gt 0 –a "$a" –lt 10 \) –a "$a" –ne 5
case语句
对同一变量进行多次的测试,比elif语句更简单、简洁
case string1 in
str1)
commands-list1;;
str2)
commands-list2;;
...
strn)
commands-listn;;
esac
使用case语句时应注意以下几点
(1) 每个正则表达式后面可有一条或多条命令,其最后一条命令必须以两个分号(;;)结束。
(2) 正则表达式中可以使用通配符。
(3) 如果一个正则表达式是由多个模式组成,那么各模式之间应以竖线“|”隔开。表示各模式是“或”关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表。
使用case语句时应注意以下几点
(4) 各正则表达式是唯一的,不应重复出现。
(5) case语句以关键字case开头,以关键字esac结束。
(6) case的退出(返回)值是整个结构中最后执行的那个命令的退出值。若没有执行任何命令,则退出值为零。
for语句
格式:
for variable [in argument-list]
do
command-list
Done
其中的[in argument-list]部分为可选项,由于它的不同又可有三种形式。
[in argument-list]部分三种形式
[argument-list]为变量值表
变量variable依次取值表中各字符串
[argument-list]为文件的表达式
变量的值依次取当前目录(或指定目录)下与文件表达式相匹配的文件名,每取值一次,就进入循环体执行命令表,直到所有匹配的文件名取完为止。
[argument-list]为空
[argument-list]也可以用$*来代替,变量依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止。
while语句
格式为:
while expression
do
command-list
Done
作用:只要expression的值为真,则进入循环体,执行command-1ist中的命令,然后再做条件测试,直到测试条件为假时才终止while语句的行。
until语句
格式为:
until expression
do
command-list
done
作用: 只要expression的值为假,就执行command—lists的命令。
break和continue语句
break命令可以从循环体中退出来。格式为:
break [n]
continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。格式为:
continue [n]
算术表达式
五种基本的算术运算:+(加)、-(减)、\*(乘)、/(除)和%(取模)。shell只提供整数的运算。格式如下:
expr n1运算符n2
例:
[expr 15 \* 15
注意:在运算符的前后都留有空格,否则expr不对表达式进行计算,而直接输出它们。
自定义函数
在shell脚本中可以定义并使用函数。其定义格式为:
Function( )
{
command-list
}
函数应先定义,后使用。调用函数时,直接利用函数名调用。