概述
以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除。
一、Python风格的for循环
(1)Shell中的for循环可以是C语言风格的for循环,也可以是Python风格的for循环。
(2)我们一般见到的是Python风格的for循环,其格式为:
for variable in value_list do command1 command2 ... commandN done
- 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/bash sum=0 for n in 1 2 3 4 5 6 do echo $n ((sum+=n)) done echo "The sum is "$sum xjh@ubuntu:~/iot/tmp$ ./test.sh 1 2 3 4 5 6 The sum is 21 xjh@ubuntu:~/iot/tmp$
2) 给出一个取值范围
该用法的具体格式如下,其中start 表示起始值,end 表示终止值,中间用两个点号相连。注意这种形式只支持数字和字母。
{start..end}
#!/bin/bash sum=0 for n in {1..100} do ((sum+=n)) done echo $sum
3)使用命令的执行结果
使用反引号
``
或者$()
都可以取得命令的执行结果。这里以$()为例进行说明。xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash for filename in $(ls *.sh) do echo $filename done xjh@ubuntu:~/iot/tmp$ ./test.sh test1.sh test2.sh test.sh xjh@ubuntu:~/iot/tmp$ ls test1.sh test2.sh test.sh xjh@ubuntu:~/iot/tmp$
4)使用 Shell 通配符
Shell 通配符可以认为是一种精简化的正则表达式,通常用来匹配目录或者文件。
有了 Shell 通配符,不使用 ls 命令也能显示当前目录下的所有脚本文件,请看下面的代码:
#!/bin/bash for filename in *.sh do echo $filename done
5)使用特殊变量
Shell 中有多个特殊的变量,例如 $#、$*、$@、$?、$$ 等。当for循环中缺省in value_list时,该for循环等价 in $@,即取值列表是传递给脚本或者函数的所有参数。
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash function func(){ for str # 等价于 for str in $@ do echo $str done } func C++ Java Python C# xjh@ubuntu:~/iot/tmp$ ./test.sh C++ Java Python C# xjh@ubuntu:~/iot/tmp$
二、while循环
(1)while循环的格式如下,其中关于condition的内容,可以使用 test 或 [] 命令,也可以使用 (()) 或 [[]]。
while condition do Statement(s) to be executed if condition is true done
(2)下面的脚本实现了一个简单的加法计算器,用户每行输入一个数字,计算出所有数字的和。在终端上读取数据,可以等价为在文件中读取数据,按下 Ctrl+D 组合键表示读取到文件流的末尾,此时 read 就会读取失败,得到一个非 0 值的退出状态,导致判断条件不成立而结束循环。
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash sum=0 echo "请输入您要计算的数字,按 Ctrl+D 组合键结束读取" while read n do ((sum += n)) done echo "The sum is: $sum" xjh@ubuntu:~/iot/tmp$ ./test.sh 请输入您要计算的数字,按 Ctrl+D 组合键结束读取 11 22 33 The sum is: 66 xjh@ubuntu:~/iot/tmp$
三、until循环
(1)until 循环格式如下,当command返回值为false时才进行循环,为true时终止循环。
until command do Statement(s) to be executed until command is true done
(2)下面的脚本使用 until 命令输出 0 ~ 9 的数字:
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done xjh@ubuntu:~/iot/tmp$ ./test.sh 0 1 2 3 4 5 6 7 8 9 xjh@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/bash while : do echo -n "Input a number between 1 to 5: " read aNum case $aNum in 1|2|3|4|5) echo "Your number is $aNum!" ;; *) echo "You do not select a number between 1 to 5, game is over!" break ;; esac done
(3)举例2:如果 var1 等于 2,并且 var2 等于 0,就跳出循环。
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash for var1 in 1 2 3 do for var2 in 0 5 do if [ $var1 -eq 2 -a $var2 -eq 0 ] then break 2 else echo "$var1 $var2" fi done done xjh@ubuntu:~/iot/tmp$ ./test.sh 1 0 1 5 xjh@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/bash while : do echo -n "Input a number between 1 to 5: " read aNum case $aNum in 1|2|3|4|5) echo "Your number is $aNum!" ;; *) echo "You do not select a number between 1 to 5!" continue echo "Game is over!" ;; esac done
(3)使用 continue 跳出多层循环的例子如下。从运行结果可以看出,遇到
continue 2
时,不但跳过了内层 for 循环,也跳过了外层 for 循环。xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash for((i=1; i<=5; i++)) do for((j=1; j<=5; j++)) do if((i*j==12)) then continue 2 fi printf "%d*%d=%-4d" $i $j $((i*j)) done printf "n" done xjh@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 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
最后
以上就是超帅大白为你收集整理的Shell编程——循环(for、while、until、break与continue)一、Python风格的for循环二、while循环三、until循环四、break和continue命令的全部内容,希望文章能够帮你解决Shell编程——循环(for、while、until、break与continue)一、Python风格的for循环二、while循环三、until循环四、break和continue命令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复