Shell脚本的条件控制和循环语句
条件判断:if语句
语法格式:
if[expression] then Statement(s)tobeexecutedifexpressionistrue fi
注意:expression和方括号([])之间必须有空格,否则会有语法错误。
if语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell有三种if...else语句:
if...fi语句 if...else...fi语句 if...elif...else...fi语句
示例:
#!/bin/bash/ a=10 b=20 if[$a==$b] then echo"aisequaltob" elif[$a-gt$b] then echo"aisgreatertob" else echo"aislesstob" fi
if...else语句也可以写成一行,以命令的方式来运行:
a=10;b=20;if[$a==$b];thenecho"aisequaltob";elseecho"aisnotequaltob";fi;
if...else语句也经常与test命令结合使用,作用与上面一样:
#!/bin/bash/ a=10 b=20 iftest$a==$b then echo"aisequaltob" else echo"aisnotequaltob" fi
分支控制:case语句
case...esac与其他语言中的switch...case语句类似,是一种多分枝选择结构。
示例:
#!/bin/bash/ grade="B" case$gradein "A")echo"VeryGood!";; "B")echo"Good!";; "C")echo"ComeOn!";; *) echo"YouMustTry!" echo"Sorry!";; esac
转换成C语言是:
#include<stdio.h> intmain(){ chargrade='B'; switch(grade){ case'A':printf("VeryGood!");break; case'B':printf("VeryGood!");break; case'C':printf("VeryGood!");break; default: printf("YouMustTry!"); printf("Sorry!"); break; } return0; }
对比看就很容易理解了。很相似,只是格式不一样。
需要注意的是:
取值后面必须为关键字in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。;;与其他语言中的break类似,意思是跳到整个case语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号*捕获该值,再执行后面的命令。
再举一个例子:
#!/bin/bash option="${1}" case${option}in "-f")FILE="${2}" echo"Filenameis$FILE" ;; "-d")DIR="${2}" echo"Dirnameis$DIR" ;; *) echo"`basename${0}`:usage:[-ffile]|[-ddirectory]" exit1#Commandtocomeoutoftheprogramwithstatus1 ;; esac
运行结果:
$./test.sh test.sh:usage:[-ffilename]|[-ddirectory] ./test.sh-findex.html Filenameisindex.html
这里用到了特殊变量${1},指的是获取命令行的第一个参数。
for循环
shell的for循环与c、php等语言不同,同Python很类似。下面是语法格式:
for变量in列表
do command1 command2 ... commandN done
示例:
#!/bin/bash/ forvaluein12345 do echo"Thevalueis$value" done
输出:
Thevalueis1 Thevalueis2 Thevalueis3 Thevalueis4 Thevalueis5
顺序输出字符串中的字符:
forstrin'Thisisastring' do echo$str done
运行结果:
Thisisastring
遍历目录下的文件:
#!/bin/bash forFILEin* do echo$FILE done
上面的代码将遍历当前目录下所有的文件。在Linux下,可以改为其他目录试试。
遍历文件内容:
city.txt
beijing tianjin shanghai #!/bin/bash citys=`catcity.txt` forcityin$citys echo$city done
输出:
beijing
tianjin
shanghai
while循环
只要while后面的条件满足,就一直执行do里面的代码块。
其格式为:
whilecommand
do
Statement(s)tobeexecutedifcommandistrue
done
命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。
示例:
#!/bin/bash c=0; while[$c-lt3] do echo"Valuecis$c" c=`expr$c+1` done
输出:
Valuecis0
Valuecis1
Valuecis2
这里由于shell本身不支持算数运算,所以使用expr命令进行自增。
until循环
until循环执行一系列命令直至条件为true时停止。until循环与while循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until循环更加有用。
将上面while循环的例子改改,就能达到一样的效果:
#!/bin/bash c=0; until[$c-eq3] do echo"Valuecis$c" c=`expr$c+1` done
首先do里面的语句块一直在运行,直到满足了until的条件就停止。
输出:
Valuecis0
Valuecis1
Valuecis2
跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用break和continue来跳出循环。
break
break命令允许跳出所有循环(终止执行后面的所有循环)。
#!/bin/bash i=0 while[$i-lt5] do i=`expr$i+1` if[$i==3] then break fi echo-e$i done
运行结果:
1
2
在嵌套循环中,break命令后面还可以跟一个整数,表示跳出第几层循环。例如:
breakn
表示跳出第n层循环。
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
#!/bin/bash i=0 while[$i-lt5] do i=`expr$i+1` if[$i==3] then continue fi echo-e$i done
运行结果:
1
2
4
5
以上内容是小编给大家介绍的Shell脚本的条件控制和循环语句的相关知识,希望对大家有所帮助!