本文旨在复习shell实现循环结构的3种语句for、while和until,循环比较以及如何跳出循环

知识储备


  • 循环结构是在一定条件下反复执行某段程序的流程结构,循环语句是实现该结构的表现形式

  • 循环语句通常有for语句、while语句和until语句,语句有2部分组成

    • 循环体:被反复执行的可怜的程序片段

    • 循环终止条件:满足该条件后,从反复执行中解脱出来

  • 跳出循环有break命令、continue命令,在本文最后做阐述

  • 循环语句我以结构流程图、代码实现[代码格式]、具体例子来阐述


For循环语句


流程图

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第1张图片

代码实现

1
2
3
4
5
6


for 变量 in 列表
do
    command1
    command2
    ......
done

请注意:列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

具体例1:求1+2+3+4+...+100的和   

1
2
3
4
5
6
7


#!/bin/bash

for i in $(seq 1 100)
do
    
sum=$[$sum+$i]
done
echo 
"1+2+3+4+...+99+100 = $sum "

wKiom1X__YHhM8C2AAMhOI4JwuU193.bmp


具体例2:列出当前目录下所有文件名一次一行   

1
2
3
4
5
6


#!/bin/bash

for i in $(ls -A)
do
    echo 
"$i"
done

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第2张图片


具体例3:For循环另外一种形式写法[类C语言写法]

1
2
3


#!/bin/bash

for((i=1;i<=5;i++));do echo $i;done

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第3张图片


While循环语句


流程图

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第4张图片

代码实现

1
2
3
4


while command(通常为测试条件)
do
   Statement(s) to be executed 
if command is true
done

具体例子:用While语句实现1+2+3+4+...+100的和   

1
2
3
4
5
6
7
8
9


#!/bin/bash

i=
"1"
while [ $i -le 100 ]
do
   
sum=`expr $sum + $i`
   i=$[$i+
1]
done
echo 
"The SUM = $sum"

wKioL1YABlOSG0MQAAKTYKJHOzQ466.bmp

请注意:while当条件为真时继续执行循环体,当条件为假跳出循环


Until循环语句


流程图

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第5张图片

代码实现

1
2
3
4


until command(一般为条件表达式)
do
   Statement(s) 
to be executed until command is true
done

具体例子:用until语句打印输出A,B,C,D...T结束   

1
2
3
4
5
6
7
8
9


#!/bin/bash 

i=
"41"
until [ $i -ge 
55 ]
do
    echo -e 
"\x$i,\c"
    ((i=$i+
1))
done
echo

wKioL1YACRqhOnLGAAKbuCsIF4M088.bmp


3种循环比较


循环主要有2种结构

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第6张图片

从上面流程图,显然可以看出while循环是"当型的",until循环是"直到的"

根据具体应用场景区别使用,不过总体来说3种循环for最常用,其他的结构清晰,使用效果差别不大


跳出循环


在循环过程中,只有达到循环结束条件时才能跳出循环。但有时候需要强制跳出循环,Shell中使用break和continue命令来实现这一功能,不过俩者是有区别的。


Break命令强制跳出所有循环(终止执行后面的所有循环,可以加参数N跳出第N层循环)。

具体例1:系统问你Lance是否帅气?只有回答yes才能跳出循环,否则陷入无限问的死循环

1
2
3
4
5
6
7
8
9
10
11


#!/bin/bash 

while :
do 
    
read -p "Is Lance Smart?" answer
    
if [ $answer = "yes" ];then
        
break
    
else
        echo 
"HeHe?" 
    fi
done

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第7张图片

请注意如果有多层嵌套循环,使用break可以跳出指定N层的循环

具体例2:这里的break 2 就是跳出内部的for var2循环,不加参数默跳出整个循环,即退出shell了

1
2
3
4
5
6
7
8
9
10
11
12


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


Continue命令强制跳出当前所在循环[本质是进行下一次循环]

具体例1:从1到50的所有奇数中找出能被3整除的,不能整除的打印Can't

1
2
3
4
5
6
7
8
9
10
11
12


#!/bin/bash

for i in $(seq 1 2 50)
do
    
if [ $[$i%3] -eq 0 ];then
        echo 
"$i"
        
continue
        echo 
"$i can be divided exactly"
    
else
        echo 
"$i Can't!"
    fi
done

[9-13]Shell系列4——循环结构for、while、until及跳出循环_第8张图片