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

本文详细介绍了Shell脚本中的循环控制结构,包括Python风格的for循环、while循环和until循环的使用方式,以及break和continue命令的实践示例。通过具体例子展示了如何在不同场景下灵活运用这些循环控制,帮助读者深入理解Shell脚本的循环机制。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值