流程控制语句
1、条件语句
对于先做判断在选择路径的情况,使用分支结构,这需要用到条件语句。条件语句用于根据指定的条件来选择执行程序,实现程序的分支结构。Shell提供了2个条件语句:if和case。
1、if语句
if语句通过判定条件表达式做出选择。大多数情况下,可以使用test命令来对条件进行测试,比如可以比较字符串、判断文件是否存在。例如
if test $[vall] -eq $[val2]
实际应用中通常用方括号来代替test.
根据语法格式,if语句可分为以下三种类型
(1)if...else
if [ 条件表达式 ] then 语句序列 fi
这是最简单的if机构,如果条件表达式结果返回true,"then"后面的语句将会执行,否则不会执行任何语句。最后必须以fi语句结尾来闭合if语句。下面给出一个简单的例子。
#!/bin/bash a=1 b=2 if [ $a -lt $b ] then echo "a<b" fi
(2)if...else...fi
语法格式如下:
if [ 条件表达式 ] then 语句序列1 else 语句序列2 fi
如果条件表达式返回true,那么then后面的语句将会执行,否则执行"else”后面的语句。下面给出一个简单的例子
#!/bin/bash a=2 b=1 if [ $a -lt $b ] then echo "a<b" else echo "a!<b" fi
(2)if...elif...fi
这种结构可以对多个条件进行判断,语法格式如下:
if [ 条件表达式1] then 语句序列1 elif [ 条件表达式2] then 语句序列2 elif [ 条件表达式3] then 语句序列3 .... else 语句序列n fi
哪一个表达式为true,就执行哪个表达式后面的语句;如果都为false,那么执行else后面的语句。下面给出一个示例
#!/bin/bash a=2 b=1 if [ $a == $b ] then echo "a=b" elif [ $a -gt $b ] then echo "a>b" elif [ $a -lt $b ] then echo "a<b" else echo "input error" fi
2、case语句
这是一种多选择结构,与其他语言中的“switch...case"语句类似。case语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。如果存在很多条件,那么可以使用case语句来代替if语句。case语句的语法格式如下:
case 值 in 模式1) 语句序列1 ;; 模式2) 语句序列2 ;; ... 模式n) 语句序列n ;; *) 其他语句序列 esac
值可以是变量或常数。模式可以包含多个值,使用”|“将各个值分开,只要值匹配模式中的一个值即可视为匹配。例如”3|5“表示匹配3或5均可。
Shell将值逐一同各个模式进行比较,当发现匹配某一模式后,就执行该模式后面的语句序列。直到遇见两个分号;;为止。;;与其他语言中的break类似,用于终止语句执行,跳到整个case结构的最后。*表示任意模式,如果不能撇陪任何模式,则执行*后面的语句序列。由于case语句依次检查匹配模式,”*)“应当放在最后。
下面给出一个示例,显示当前登录Linux的用户
#!/bin/bash case $USER in li) echo "欢迎用户登录" ;; root) echo "超级管理员" echo "欢迎登陆" ;; *) echo "欢迎 $USER!"; esac
2、循环结构
Shell提供的循环结构有3种,分别是while、until和for。
1、循环语句while
while循环用于不断执行一系列命令,直到测试条件为假。其语法格式如下:
while 测试条件 do 语句序列 done
命令执行完,控制返回循环顶部,然后在做条件测试,直到测试条件为假时才终止while语句的执行。只要测试条件为真,do和done之间就一直会进行。
下面给出一个实例,用while循环求1~100的总和。
#!/bin/bash total=0 num=0 while [ $num -le 100 ] do total=`expr $total + $num` num=`expr $num + 1` done echo "结果等于 $total"
2、循环语句until
until循环用来执行一系列命令,直到所指定的条件为真时才终止循环,基本格式如下:
until 测试条件 do 语句序列 done
先进行条件测试,如果返回值为假,则继续返回循环体内的语句,否则跳出循环。
until循环于while循环在处理方式上刚好相反,一般while循环优于until循环,但在极少数的情况下,until循环更加有用。
同样,用until循环求1~100的总和。
#!/bin/bash total=0 num=0 until [ $num -gt 100 ] do total=`expr $total + $num` num=`expr $num + 1` done echo "结果等于 $total"
3、循环语句for
until和while循环通常用于条件性循环,遇到特定的条件才会终止循环。而for循环适用于明确知道重复执行次数的情况,其语法格式如下:
for 变量 [in 列表] do 语句序列 done
其中变量是指要在循环内部用来匹配列表当中的对象,列表是在for循环的内部要操作的对象,可以是一组值组成的序列,每个值通过空格分隔,每循环一次,就将列表中的下一个值赋给变量。"in 列表"是可选的,如果不用它,for循环将自动使用命令行的位置参数。
例如下面脚本按顺序输出列表中的数字。
for val in 1 2 3 4 5 6 7 do echo $val done
下面的脚本显示主目录下的文件
#!/bin/bash for FILE in $HOME/*.* do echo $FILE done
4、其他循环语句
在循环过程中,有时候需要在未达到循环条件时强制跳出循环,像大多数编程语言一样,Shell也可以使用break和continue来跳出循环。
break语句用来终止一个重复执行的循环。这种循环可以是for、until、或者while语句构成的循环。其语法格式如下:
break [n]
其中n表示要跳出的几层循环,默认值是1,表示只跳出一层循环。
下面是一个嵌套循环的例子,如果var1等于4,并且var2等于2,就跳出循环。
#!/bin/bash for var1 in 1 4 7 do for var2 in 2 5 8 do if [ $var1 == 4 -a $var2 == 2 ] then break 2 else echo "第一层: $var1" echo "第二层: $var2" fi done done
continue 语句跳过循环体中位于它后面的语句,回到本层循环的开头,并进行下一次的循环。其语法格式如下:
continue [n]
其中n表示从包含continue语句的最内层循环体向外调到第n层循环。
exit用来退出一个Shell程序,并设置退出值。其语法格式如下:
exit [n]
其中n是设定的退出值。如果未给出n值,则退出值为最后一个命令的执行状态。