700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > shell编程中for/while/util/case/select/break/continue

shell编程中for/while/util/case/select/break/continue

时间:2018-11-13 17:41:17

相关推荐

shell编程中for/while/util/case/select/break/continue

独角兽企业重金招聘Python工程师标准>>>

Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for、while和until。while循环和for循环属于“当型循环”,而until属于“直到型循环”。循环控制符:break和continue控制流程转向。

一、while语句结构

while循环用于不断执行一系列命令,也用于从输入文件中读取数据,其格式为:

//while 命令do命令1命令2. . .done

虽然通常只使用一个命令,但在 while和do之间可以放几个命令。命令通常用作测试条

件。

只有当命令的退出状态为 0时,do和done之间命令才被执行,如果退出状态不是 0,则循

环终止。

命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。

实例

#!/bin/bash# Program:# This program will show the use of if# History:# /1/8 Alex First releasei=10while [[ $i -gt 5 ]]doecho $ii=`expr $i - 1`; doneexit 0

注意:在Shell中四则运算不能简简单单的加减乘除,应该要写如下的格式:val1=`$val2 - 1`其中“=”后面用“`”包住表达式,这个符号在Shell中十分有用,是Tab键上面“~”的原来形式。可以用来将很多命令的结果保存到一个变量中去。接着就是运算符了,运算符的左右两边必须是空格,否则会出错。

deyuy/bin/my_shell >> ./while1.sh109876

注意:1.expr命令的用法请参考/uid-25880122-id-2937521.html2.``的作用是运行``之间的命令,并且将命令运行的结果返回。详细请参考:/miyatang/article/details/80771233.更多while实例参考:/firefoxbug/article/details/7237319

二、until语句

until循环执行一系列命令直至条件为真时停止。 until循环与while循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候—也只是极少数情况下, until循环更加有用。

//until循环格式为:until 条件命令1. . .done

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一

点。

until循环中,只要条件不为真,就执行do和done之间的循环命令,或者说,在until循环中,一直执行do和done之间的循环命令,直到条件为真;

–避免生成死循环。

# Program:# This program will show the use of until# History:# /1/13 Alex First releasesum=0num=10until test $num -eq 0dosum=`expr $sum + $num`num=`expr $num - 1`doneecho "sum = $sum"exit 0deyuy/bin/my_shell >> sh until.shsum = 55

三、for 语句结构

//for循环一般格式为:for 变量名i n列表do命令1命令2…done

当变量值在列表里, for循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的shell命令和语句。

变量名为任何单词。in列表用法是可选的,如果不用它, for循环使用命令行的位置参数。

in列表可以包含替换、字符串和文件名,列表可以自定义,也可以通过命令返回值生成,下面是一些常用例子。

1) 整数列表

#!/bin/bash# Program:# This program will show the use of for# History:# /1/12 First release# 自定义列表for loop in 1 2 3 4 5doecho "loop=$loop"doneexit 0deyuy/bin/my_shell >> chmod u+x for1.shdeyuy/bin/my_shell >> ./for1.shloop=1loop=2loop=3loop=4loop=5//还可以通过读取文件内容生成变量列表deyuy/bin/my_shell >> vim num.txt1 2 3 4 5678#!/bin/bash# Program:# This program will show the use of for# History:# /1/12 First release# 以命令返回值作为列表i=0for i in `cat num.txt`doecho "i=$i"doneexit 0deyuy/bin/my_shell >> ./for1.shi=1i=2i=3i=4i=5i=6i=7i=8

2) 字符串列表

#!/bin/bash# Program:# This program will show the use of for# History:# /1/12 First release# 自定义列表:带引号i=0for loop in "apple hhhh bbbb eeee"doi=`expr $i + 1`echo "loop=$loop"echo "count=$i"doneexit 0deyuy/bin/my_shell >> chmod u+x for4.shdeyuy/bin/my_shell >> ./for4.shloop=apple hhhh bbbb eeeecount=1*说明:从结果可以看出for循环打印字符串到结束,包括空格,只执行了一次。如果把 in列表改为 for loop in "apple" "hhhh" "bbbb" "eeee"则输出结果为loop=applecount=1loop=hhhhcount=2loop=bbbbcount=3loop=eeeecount=4

#!/bin/bash# Program:# This program will show the use of for# History:# /1/12 First release# 自定义列表,不带引号i=0for loop in apple hhhh bbbb eeeedoi=`expr $i + 1`echo "loop=$loop"echo "count=$i" doneexit 0deyuy/bin/my_shell >> ./for4.shloop=applecount=1loop=hhhhcount=2loop=bbbbcount=3loop=eeeecount=4

注意:对比两张方式输出的不同可以看出,如果用户想让把空格分割的每个单词都输出要通过第二种方式。

3) 打印当前目录下所有文件

# Program:# This program will show the use of for# History:# /1/12 First releasefor loop in `ls`doecho "$loop"doneexit 0deyuy/bin/my_shell >> sh for2.shapp1for1.shfor2.shfun1.shhello.shhh.shif.shif2.shtest.shtest2.shvar.shwhile1.sh

4) 循环计数

#!/bin/bash# Program:# This program will show the use of for # 统计当前目录下文件数# History:# /1/12 First releasecounter=0for files in *docounter=`expr $counter + 1`doneecho "There are $counter files in `pwd` directory."exit 0deyuy/bin/my_shell >> sh for3.shThere are 13 files in /home/deyuy/bin/my_shell directory.

5) 使用位置参数

#!/bin/bash# Program:# This program will show the use of for# History:# /1/13 releasei=0for paramsdoi=`expr $i + 1`echo "You supplied $params as a command line option"echo "count=$i"doneecho $paramsexit 0deyuy/bin/my_shell >> ./for5.sh p1 p2 p3You supplied p1 as a command line optioncount=1You supplied p2 as a command line optioncount=2You supplied p3 as a command line optioncount=3p3###下面的脚本包含i n"$ @",结果与上面的脚本相同。#!/bin/bash# Program:# This program will show the use of for# History:# /1/13 releasei=0for params in "$@"doi=`expr $i + 1`echo "You supplied $params as a command line option"echo "count=$i"doneecho $paramsexit 0deyuy/bin/my_shell >> ./for5.sh p1 p2 p3You supplied p1 as a command line optioncount=1You supplied p2 as a command line optioncount=2You supplied p3 as a command line optioncount=3p3###下面的脚本包含i n"$ *",结果与上面的脚本不同。#!/bin/bash# Program:# This program will show the use of for# History:# /1/13 releasei=0for params in "$*"doi=`expr $i + 1`echo "You supplied $params as a command line option"echo "count=$i"doneecho $paramsexit 0deyuy/bin/my_shell >> ./for5.sh p1 p2 p3You supplied p1 p2 p3 as a command line optioncount=1p1 p2 p3

说明:关于$@和$*的区别请参考/yuexiaxiaoxi/articles/4203609.html

6)循环嵌套

嵌入循环可以将一个f o r循环嵌在另一个f o r循环内:

for 变量名1 in列表1dofor 变量名2 in 列表2do命令1. . .donedone

下面脚本即为嵌入for循环,这里有两个列表apps和scripts。第一个包含服务器上应用

的路径,第二个为运行在每个应用上的管理脚本。对列表 apps上的每一个应用,列表

scripts里的脚本将被运行,脚本实际上为后台运行。脚本使用tee命令在登录文件上放一条

目,因此输出到屏幕的同时也输出到一个文件。查看输出结果就可以看出嵌入for循环怎样使

用列表scripts以执行列表apps上的处理。

#!/bin/bash# Program:# This program will show the use of for# History:# /1/13 releaseAPPS="/apps/accts /apps/claims /apps/stock /apps/serv"SCRIPTS="audit.check report.run cleanup"MY_DATE=`date +%H:%M" on "%d/%m/%Y`i=0j=0#outer loopfor loop in $APPSdoi=`expr $i + 1`#inner loopfor loop2 in $SCRIPTSdoj=`expr $i + 1`echo "system $loop now running $loop2 at $MY_DATE"echo "inner loop counter=$j"doneecho "outer loop counter=$i"doneecho $paramsdeyuy/bin/my_shell >> ./for6.shsystem /apps/accts now running audit.check at 20:53 on 12/01/inner loop counter=2system /apps/accts now running report.run at 20:53 on 12/01/inner loop counter=2system /apps/accts now running cleanup at 20:53 on 12/01/inner loop counter=2outer loop counter=1system /apps/claims now running audit.check at 20:53 on 12/01/inner loop counter=3system /apps/claims now running report.run at 20:53 on 12/01/inner loop counter=3system /apps/claims now running cleanup at 20:53 on 12/01/inner loop counter=3outer loop counter=2system /apps/stock now running audit.check at 20:53 on 12/01/inner loop counter=4system /apps/stock now running report.run at 20:53 on 12/01/inner loop counter=4system /apps/stock now running cleanup at 20:53 on 12/01/inner loop counter=4outer loop counter=3system /apps/serv now running audit.check at 20:53 on 12/01/inner loop counter=5system /apps/serv now running report.run at 20:53 on 12/01/inner loop counter=5system /apps/serv now running cleanup at 20:53 on 12/01/inner loop counter=5outer loop counter=4

四、case结构

case语句为多选择语句。可以用 case语句匹配一个值与一个模式,如果匹配成功,执行相

匹配的命令。case语句格式如下:

case expression inpattern1 )statements ;;pattern2 )statements ;;...esac

case工作方式如上所示。取值后面必须为单词 i n,每一模式必须以右括号结束。取值可以

为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续

其他模式。如果无一匹配模式,使用星号 *捕获该值,再接受其他输入。

模式部分可能包括元字符,与在命令行文件扩展名例子中使用过的匹配模式类型相同,

即:

* 任意字符。

? 任意单字符。

[..] 类或范围中任意字符。

注意:

1.模式字符串中可以使用通配符

2.如果一个模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表各模式是“或”的关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令列表。

3.各模式字符串应是唯一的,不应重复出现,并且要合理安排它们的出现顺序,例如,不应将“*”作为头一个模式字符串,因为“*”可以与任何字符串匹配,若第一个出现,就不会再检查其他模式了。

4.case语句以关键字case开头,以关键字esac结束。

5.case的退出(返回)值是整个结构中最后执行的命令的退出值。若没有执行任何命令,则退出值为0.

#!/bin/bash# Program:# This program will show the use of for# History:# /1/13 First releasecase $1 iny|Y)echo "your choice is yes";;n|N)echo "your choice is no";;*)echo "your choice is others";;esacexit 0deyuy/bin/my_shell >> chmod u+x case.shdeyuy/bin/my_shell >> ./case.sh yyour choice is yesdeyuy/bin/my_shell >> ./case.sh nyour choice is nodeyuy/bin/my_shell >> ./case.sh jjjjyour choice is others

五、Select结构

格式:

select变量 in 列表do命令行(通常用到循环变量)done

制作一个选择表,在列表中选择一个选项执行命令行。如果选择的变量不在列表序列中,则返回一个空值。需要用break退出循环。

#!/bin/bash# Program:# This program will show the use of for# History:# /1/13 First releaseecho "a is 5 ,b is 3. Please select your method: "a=5b=3select var in "a+b" "a-b" "a*b" "a/b"dobreakdonecase $var in"a+b")echo 'a+b= '`expr $a + $b`;;"a-b")echo 'a-b= '`expr $a - $b`;;"a*b")echo 'a*b= '`expr $a \* $b`;;"a/b")echo 'a/b= '`expr $a / $b`;;*)echo "input error"esacdeyuy/bin/my_shell >> chmod u+x select.shdeyuy/bin/my_shell >> ./select.sha is 5 ,b is 3. Please select your method:1) a+b2) a-b3) a*b4) a/b#? 3a*b= 15

六、break和continue

–1、break:用于立即终止当前循环的执行,break命令可以使用户从循环体中退出来。

–语法:break[n] ,其中,n表示要跳出几层循环,默认值为1

#!/bin/bashfor var1 in 1 2 3dofor var2 in 0 5doif [ $var1 -eq 2 -a $var2 -eq 0 ]thenbreak 2elseecho "$var1 $var2"fidonedone

运行结果:

1 0

1 5

–2、continue:跳过循环体中在其之后的语句,会返回到本循环层的开头,进行下一次循环。

–语法:continue[n],其中,n表示从包含continue语句的最内层循环体向外跳到第几层循环,默认值为1,循环层数是由内向外编号。

#!/bin/bashNUMS="1 2 3 4 5 6 7"for NUM in $NUMSdoQ=`expr $NUM % 2`if [ $Q -eq 0 ]thenecho "Number is an even number!!"continuefiecho "Found odd number"done

运行结果:

Found odd numberNumber is an even number!!Found odd numberNumber is an even number!!Found odd numberNumber is an even number!!Found odd number

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。