700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Shell编程——循环(for while until break与continue)

Shell编程——循环(for while until break与continue)

时间:2022-04-15 03:36:18

相关推荐

Shell编程——循环(for while until break与continue)

以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除。

一、Python风格的for循环

(1)Shell中的for循环可以是C语言风格的for循环,也可以是Python风格的for循环。

(2)我们一般见到的是Python风格的for循环,其格式为:

for variable in value_listdocommand1command2...commandNdone

variable 表示变量,value_list 表示取值列表,for 与 in 是 Shell 中的关键字。value_list是由一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每次循环都会从value_list 中取出一个值赋给变量variable,然后进入循环体。

(3)取值列表 value_list 的形式

取值列表 value_list 的形式有多种,比如直接给出具体的值,给出一个范围,使用命令产生的结果,使用通配符等。

1)直接给出具体的值

可以在 in 关键字后面直接给出具体的值,多个值之间以空格分隔。

xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bashsum=0for n in 1 2 3 4 5 6doecho $n((sum+=n))doneecho "The sum is "$sumxjh@ubuntu:~/iot/tmp$ ./test.sh 123456The sum is 21xjh@ubuntu:~/iot/tmp$

2)给出一个取值范围

该用法的具体格式如下,其中start 表示起始值,end 表示终止值,中间用两个点号相连。注意这种形式只支持数字和字母。

{start..end}

#!/bin/bashsum=0for n in {1..100}do((sum+=n))doneecho $sum

3)使用命令的执行结果

使用反引号``或者$()都可以取得命令的执行结果。这里以$()为例进行说明。

xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bashfor filename in $(ls *.sh)doecho $filenamedonexjh@ubuntu:~/iot/tmp$ ./test.sh test1.shtest2.shtest.shxjh@ubuntu:~/iot/tmp$ lstest1.sh test2.sh test.shxjh@ubuntu:~/iot/tmp$

4)使用 Shell 通配符

Shell 通配符可以认为是一种精简化的正则表达式,通常用来匹配目录或者文件。

有了 Shell 通配符,不使用 ls 命令也能显示当前目录下的所有脚本文件,请看下面的代码:

#!/bin/bashfor filename in *.shdoecho $filenamedone

5)使用特殊变量

Shell 中有多个特殊的变量,例如 $#、$*、$@、$?、$$ 等。当for循环中缺省in value_list时,该for循环等价 in $@,即取值列表是传递给脚本或者函数的所有参数。

xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bashfunction func(){for str # 等价于 for str in $@doecho $strdone}func C++ Java Python C#xjh@ubuntu:~/iot/tmp$ ./test.sh C++JavaPythonC#xjh@ubuntu:~/iot/tmp$

二、while循环

(1)while循环的格式如下,其中关于condition的内容,可以使用 test 或 [] 命令,也可以使用 (()) 或 [[]]。

while conditiondoStatement(s) to be executed if condition is truedone

(2)下面的脚本实现了一个简单的加法计算器,用户每行输入一个数字,计算出所有数字的和。在终端上读取数据,可以等价为在文件中读取数据,按下 Ctrl+D 组合键表示读取到文件流的末尾,此时 read 就会读取失败,得到一个非 0 值的退出状态,导致判断条件不成立而结束循环。

xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bashsum=0echo "请输入您要计算的数字,按 Ctrl+D 组合键结束读取"while read ndo((sum += n))doneecho "The sum is: $sum"xjh@ubuntu:~/iot/tmp$ ./test.sh 请输入您要计算的数字,按 Ctrl+D 组合键结束读取112233The sum is: 66xjh@ubuntu:~/iot/tmp$

三、until循环

(1)until 循环格式如下,当command返回值为false时才进行循环,为true时终止循环。

until commanddoStatement(s) to be executed until command is truedone

(2)下面的脚本使用 until 命令输出 0 ~ 9 的数字:

xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/basha=0until [ ! $a -lt 10 ]do echo $aa=`expr $a + 1`donexjh@ubuntu:~/iot/tmp$ ./test.sh 0123456789xjh@ubuntu:~/iot/tmp$

四、break和continue命令

(1)在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环。这时可以使用 break 和 continue 来跳出循环。

(2)注意,C语言中的break 和 continue 只能跳出当前层次的循环,内层循环中的 break 和 continue 对外层循环不起作用。Shell 中的 break 和 continue 通过修改其选项n,除了可以跳出当前循环(n=1或者缺省时),还可以能够跳出多层循环(n大于1)。实际开发中一般用来跳出当前层次的循环,很少有需要跳出多层循环的情况。

1、break命令

(1)break命令的格式如下,其中n表示跳出第n层循环,如果缺省则表示跳出当前循环。

break n

(2)举例1:脚本进入死循环直至用户输入数字大于5。

#!/bin/bashwhile :doecho -n "Input a number between 1 to 5: "read aNumcase $aNum in1|2|3|4|5) echo "Your number is $aNum!";;*) echo "You do not select a number between 1 to 5, game is over!"break;;esacdone

(3)举例2:如果 var1 等于 2,并且 var2 等于 0,就跳出循环。

xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bashfor var1 in 1 2 3dofor var2 in 0 5doif [ $var1 -eq 2 -a $var2 -eq 0 ]thenbreak 2elseecho "$var1 $var2"fidonedonexjh@ubuntu:~/iot/tmp$ ./test.sh 1 01 5xjh@ubuntu:~/iot/tmp$

2、continue命令

(1)continue的格式如下,其中 n 表示循环的层数。

continue n

如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了一次continue。

(2)使用continue跳过本次循环的例子如下。当输入大于5的数字时while循环也不会结束,而且continue语句后的echo "Game is over!"不会被执行。

#!/bin/bashwhile :doecho -n "Input a number between 1 to 5: "read aNumcase $aNum in1|2|3|4|5) echo "Your number is $aNum!";;*) echo "You do not select a number between 1 to 5!"continueecho "Game is over!";;esacdone

(3)使用 continue 跳出多层循环的例子如下。从运行结果可以看出,遇到continue 2时,不但跳过了内层 for 循环,也跳过了外层 for 循环。

xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bashfor((i=1; i<=5; i++))dofor((j=1; j<=5; j++))doif((i*j==12))thencontinue 2fiprintf "%d*%d=%-4d" $i $j $((i*j))doneprintf "\n"donexjh@ubuntu:~/iot/tmp$ ./test.sh 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 xjh@ubuntu:~/iot/tmp$

3、break 和 continue 的区别

break 用来结束当前层次的循环(不加n时),当前层次的循环语句不再有执行的机会。

continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

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