以下内容源于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 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。