shell脚本编程-循环

shell中的循环主要有for、while、until、select几种

一、for循环

二、while循环

三、until循环

四、select循环

五、嵌套循环

六、循环控制

一、for循环

  1.列表for循环

  for VARIABLE in (list)

  do

    command

  done

  执行一定次数的循环(循环次数等于列表元素个数)

 1 # cat fruit01.sh 
 2 #!/bin/bash
 3 for FRUIT in apple arange banana pear
 4 do
 5     echo "$FRUIT is John's favorite"
 6 done
 7 echo "No more fruits"
 8 # sh ./fruit01.sh 
 9 apple is John's favorite
10 arange is John's favorite
11 banana is John's favorite
12 pear is John's favorite
13 No more fruits
 1 root@kali:~/Shell# vim fruit02.sh
 2 root@kali:~/Shell# cat fruit02.sh 
 3 #!/bin/bash
 4 fruits="apple oragne banana pear"  #将列表定义到一个变量中,以后有任何修改只需要修改变量即可
 5 for FRUIT in ${fruits}
 6 do
 7     echo "$FRUIT is John's favorite"
 8 done
 9 echo "No more fruits"
10 root@kali:~/Shell# sh ./fruit02.sh 
11 apple is John's favorite
12 oragne is John's favorite
13 banana is John's favorite
14 pear is John's favorite
15 No more fruits

  如果列表是数字:

 1 root@kali:~/Shell# vim for_list01.sh
 2 root@kali:~/Shell# cat for_list01.sh 
 3 #!/bin/bash
 4 for VAR in 1 2 3 4 5
 5 do 
 6     echo "Loop $VAR times"
 7 done
 8 #执行结果
 9 root@kali:~/Shell# sh ./for_list01.sh 
10 Loop 1 times
11 Loop 2 times
12 Loop 3 times
13 Loop 4 times
14 Loop 5 times

  使用{}表示,需相应的shell环境支持

 1 root@kali:~/Shell# vim for_list02.sh 
 2 root@kali:~/Shell# cat for_list02.sh 
 3 #!/bin/bash
 4 for VAR in {1..5}
 5 do
 6     echo "Loop $VAR times"
 7 done
 8 root@kali:~/Shell# sh ./for_list02.sh 
 9 Loop 1 times
10 Loop 2 times
11 Loop 3 times
12 Loop 4 times
13 Loop 5 times

  使用seq替换

 1 root@kali:~/Shell# cat for_list03.sh 
 2 #!/bin/bash
 3 sum=0
 4 for VAR in `seq 1 100`
 5 #for VAR in $(seq 1 100) #也用$替换
 6 do
 7     sum=$(($sum+$VAR))
 8 done
 9 #执行结果
10 echo "Total:$sum"
11 root@kali:~/Shell# sh ./for_list03.sh 
12 Total:5050

  利用seq步长计算1到100内的奇数和

 1 root@kali:~/Shell# vim for_list04.sh 
 2 root@kali:~/Shell# cat for_list04.sh 
 3 #!/bin/bash
 4 sum=0
 5 for VAR in $(seq 1 2 100)
 6 do
 7     sum=$(($sum+$VAR))
 8 done
 9 echo "Total $sum"
10     
11 root@kali:~/Shell# sh ./for_list04.sh 
12 Total 2500

  利用ls的输出作为in的列表:

 1 root@kali:~/Shell# vim for_list05.sh
 2 root@kali:~/Shell# cat for_list05.sh 
 3 #!/bin/bash
 4 for VAR in $(ls)
 5 do
 6     ls -l $VAR
 7 done
 8 root@kali:~/Shell# sh ./for_list05.sh 
 9 -rwxr-xr-x 1 root root 136 9月  24 18:10 chk_file.sh
10 -rwxr-xr-x 1 root root 241 9月  24 18:41 detect_input.sh
11 -rw-r--r-- 1 root root 67 9月  26 11:40 for_list01.sh
12 -rw-r--r-- 1 root root 63 9月  26 11:48 for_list02.sh
13 -rw-r--r-- 1 root root 112 9月  26 12:06 for_list03.sh
14 -rw-r--r-- 1 root root 92 9月  26 12:11 for_list04.sh
15 -rw-r--r-- 1 root root 49 9月  26 12:13 for_list05.sh
16 -rw-r--r-- 1 root root 114 9月  26 11:33 fruit01.sh
17 -rw-r--r-- 1 root root 133 9月  26 11:37 fruit02.sh
18 -rwxr-xr-x 1 root root 318 9月  22 21:46 rwx.sh
19 -rwxr-xr-x 1 root root 197 9月  24 18:04 score01.sh
20 -rwxr-xr-x 1 root root 172 9月  24 18:23 score03.sh
21 -rw-r--r-- 1 root root 0 9月  22 21:46 test

  2、不带列表的for循环

    for VARIABLE

    do 

      command

    done

  需要在运行脚本时通过参数的方式给for循环传递变量值

 1 root@kali:~/Shell# vim for_list06.sh 
 2 root@kali:~/Shell# cat ./for_list06.sh 
 3 #!/bin/bash
 4 for VARIABLE
 5 do 
 6     echo -n "$VARIABLE "
 7 done
 8 echo
 9 #执行结果
10 root@kali:~/Shell# sh ./for_list06.sh 1 2 3 4 5 99
11 1 2 3 4 5 99 

  或通过$@,上面的可读性很差

 1 root@kali:~/Shell# vim for_list07.sh
 2 root@kali:~/Shell# cat for_list07.sh 
 3 #!/bin/bash
 4 for VARIABLE in $@
 5 do
 6     echo -n "$VARIABLE "
 7 done
 8 #运行时传入参数
 9 root@kali:~/Shell# sh ./for_list07.sh 1 8 9 s df
10 1 8 9 s df 

  3、类C的for循环

    需要熟悉C语言,语法:

    for ((expressoin1;expression2;expression3))

    do

      command

    done

    eg:

 1 [rhat@localhost shell]$ vim c_for01.sh 
 2 [rhat@localhost shell]$ cat c_for01.sh 
 3 #!/bin/bash
 4 for ((i=1;i<=10;i++))
 5 do
 6     echo -n "$i "
 7 done
 8 echo
 9 [rhat@localhost shell]$ sh ./c_for01.sh 
10 1 2 3 4 5 6 7 8 9 10 

  循环多个变量

[rhat@localhost shell]$ vim c_for02.sh
[rhat@localhost shell]$ cat c_for02.sh 
#!/bin/bash
for ((i=1,j=100;i<=10;i++,j--))
do
    echo "i=$i j=$j"
done
echo
#执行结果
[rhat@localhost shell]$ sh ./c_for02.sh 
i=1 j=100
i=2 j=99
i=3 j=98
i=4 j=97
i=5 j=96
i=6 j=95
i=7 j=94
i=8 j=93
i=9 j=92
i=10 j=91

  计算1到100以及1到100的奇数和

 1 [rhat@localhost shell]$ vim c_for03.sh 
 2 [rhat@localhost shell]$ cat c_for03.sh
 3 #!/bin/bash
 4 sum01=0
 5 sum02=0
 6 for ((i=1,j=1;i<=100;i++,j+=2))
 7 do
 8     let "sum01+=i"
 9     if [ $j -lt 100 ];then
10         let "sum02+=j"
11     fi
12 done
13 echo    "sum01=$sum01"
14 echo     "sum02=$sum02"
15 [rhat@localhost shell]$ sh ./c_for03.sh
16 sum01=5050
17 sum02=2500

  4、for的无限循环

    无限循环特别消耗资源,测试时注意退出条件.

1 [rhat@localhost shell]$ vim c_for04.sh
2 [rhat@localhost shell]$ cat c_for04.sh 
3 #!/bin/bash
4 for ((i=0;i<1;i+=0))
5 do
6     echo "infinite loop"
7 done
1 [rhat@localhost shell]$ vim c_for05.sh
2 [rhat@localhost shell]$ cat c_for05.sh 
3 #!/bin/bash
4 for(;1;)
5 do
6     ehco "infinite loop"
7 done

   以上代码会一直打印字符,需手动Ctrl+C停止.

二、While循环

  语法:

    while expression

    do

      command

    done

   首先测试expression的返回值,如果返回值为真则执行循环体,否则不执行循环。

 1 [rhat@localhost shell]$ vim while01.sh
 2 [rhat@localhost shell]$ cat while01.sh 
 3 #!/bin/bash
 4 CONTER=5
 5 while [[ $CONTER -gt 0 ]]
 6 do
 7     echo -n "$CONTER "
 8     let "CONTER-=1"    #每次循环减少一次CONTER的值
 9 done
10 echo
11 [rhat@localhost shell]$ sh ./while01.sh 
12 5 4 3 2 1  

  while:计算1到100的和以及1到100的奇数和

 1 [rhat@localhost shell]$ vim while02.sh 
 2 [rhat@localhost shell]$ cat while02.sh 
 3 #!/bin/bash
 4 sum01=0
 5 sum02=0
 6 j=1
 7 i=1
 8 while [[ "$i" -le "100" ]]
 9 do
10     let "sum01+=i"
11     let "j=i%2"        #变量j用来确定变量i的奇偶性,如果为奇数则j为1
12     if [[ $j -ne 0 ]];then        
13         let "sum02+=i"
14     fi
15     let "i+=1"
16 done
17 echo "sum01=$sum01"
18 echo "sum02=$sum02"
19 #执行结果
20 [rhat@localhost shell]$ sh ./while02.sh 
21 sum01=5050
22 sum02=2500

   while:猜数游戏

 1 [rhat@localhost shell]$ vim while03.sh 
 2 #!/bin/bash
 3 PRE_SET_NUM=8
 4 echo "Input a number between 1 and 10"
 5 while read GUESS
 6 do
 7     if [[ $GUESS -eq $PRE_SET_NUM ]];then
 8         echo "You get the right number"
 9         exit
10     else
11         echo "Wrong,try again"
12     fi
13 done
14 echo
15 #执行结果
16 [rhat@localhost shell]$ sh ./while03.sh 
17 Input a number between 1 and 10
18 i
19 Wrong,try again
20 1
21 Wrong,try again
22 8 
23 You get the right number

  while:按行读取文件

  例如文件为:

1 [rhat@localhost shell]$ cat student_info.txt 
2 John    30    Boy
3 Sue    28    Girl
4 Wang    25    Boy
5 Xu    23    Birl

  shell文件:

 1 [rhat@localhost shell]$ vim while04.sh
 2 #!/bin/bash
 3 FNAME=student_info.txt
 4 while read LINE    #这会产生1个shell,此为重定向
 5 #cat $FNAME | while read LINE #或者this,这会产生3个shell,第一个shell为cat,第二个sehll为管道,第三个shell为while
 6 do
 7     NAME=`echo $LINE | awk '{print $1}'`
 8     AGE=`echo $LINE | awk '{print $2}'`
 9     Sex=`echo $LINE | awk '{print $3}'`
10     echo "My name is $NAME I'm $AGE years old, I'm a $Sex"
11 done < $FNAME
12 #执行结果
13 [rhat@localhost shell]$ sh ./while04.sh
14 My name is John I'm 30 years old, I'm a Boy
15 My name is Sue I'm 28 years old, I'm a Girl
16 My name is Wang I'm 25 years old, I'm a Boy
17 My name is Xu I'm 23 years old, I'm a Birl

  while的无限循环:

  语法:3种

  while ((1))

  do

      command

  done

  ----------------------

  while true

  do

    command

  done

  ----------------------

  while :

  do

    command

  done

 1 [rhat@localhost shell]$ vim while05.sh
 2 #!/bin/bash
 3 while true
 4 do
 5     HTTPD_STATUS=`service httpd status | grep runing`
 6     if [ -z "$HTTP_STATUS" ]; then
 7         echo "HTTPD is stoped,try to restart"
 8         service httpd restart
 9     else
10         echo "HTTPD is running,wait 5 secuntil next check"
11     fi
12     sleep 5
13 done
14 #执行结果,需要有相应执行权限,否则会报错,Permission deniedLED]
15 [rhat@localhost shell]$ sh ./while05.sh 
16 HTTPD is stoped,try to restart
17 ....

 三、until循环

  until循环也是运行前测试,但是until采用的是测试假值得方式,当测试结果为假时才执行循环体,直到测试为真时才停止循环.语法:

    until exprssion

    do

      command

    done

  eg:

 1 [rhat@localhost shell]$ vim until01.sh 
 2 #!/bin/bash
 3 sum01=0
 4 sum02=0
 5 i=1
 6 until [[ $i -gt 100 ]]
 7 do
 8 let "sum01+=i"
 9 let "j=i%2"
10 if [[ $j -ne 0 ]];then
11 let "sum02+=i"
12 fi
13 let "i+=1"
14 done
15 echo $sum01
16 echo $sum02
17 [rhat@localhost shell]$ sh ./until01.sh 
18 5050
19 2500

   until无限循环

  语法:

    until ((0))

    do

      command

    done

  ------------------------------------------------

    until false

    do

      command

    done

四、select循环

  select 是一种菜单扩展循环方式,其语法和带列表的for循环类似,语法如下:

    select MENU in (list)

    do 

      command

    done

 1 [rhat@localhost shell]$ vim select01.sh 
 2 #!/bin/bash
 3 echo "Which car do you prefer?"
 4 select CAR in Benz Audi VolksWagen
 5 do
 6     break
 7 done
 8 echo "You chose $CAR"
 9 #执行结果
10 [rhat@localhost shell]$ sh ./select01.sh 
11 Which car do you prefer?
12 1) Benz
13 2) Audi
14 3) VolksWagen
15 #? 2
16 You chose Audi

  其中带有|的

 1 [rhat@localhost shell]$ vim select02.sh 
 2 #!/bin/bash
 3 select DAY in Mon Tue Wed Thu Fri Sat Sun
 4 do
 5     case $DAY in
 6     Mon) echo "Today is Monday";;
 7     Tue) echo "Today is Tuesday";;
 8     Wed) echo "Today is Wednesday";;
 9     Thu) echo "Today is Thursday";;
10     Fri) echo "Today is Friday";;
11     Sat|Sun) echo "You can have a rest today";;
12     *) echo "Unkown input,exit now" && break;;
13     esac
14 done
15 #执行结果
16 [rhat@localhost shell]$ sh ./select02.sh 
17 1) Mon
18 2) Tue
19 3) Wed
20 4) Thu
21 5) Fri
22 6) Sat
23 7) Sun
24 #? 1
25 Today is Monday
26 #? 8
27 Unkown input,exit now

五、嵌套循环

  for、while、until、select循环语句都可以使用嵌套循环.不建议三层以上的嵌套,否则程序会晦涩难懂.

 1 [rhat@localhost shell]$ vim nesting01.sh 
 2 #!/bin/bash
 3 for ((i=1;i<=9;i++))
 4 do
 5     for ((j=1;j<=9;j++))
 6     do
 7         let "multi=$i*$j"
 8         echo -n "$i*$j=$multi "
 9     done
10     echo
11 done
12 #执行结果
13 [rhat@localhost shell]$ sh ./nesting01.sh 
14 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 
15 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 
16 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 
17 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 
18 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 
19 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 
20 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 
21 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 
22 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

  or

 1 [rhat@localhost shell]$ vim nesting02.sh 
 2 #!/bin/bash
 3 i=1
 4 while [[ "$i" -le "9" ]]
 5 do
 6     j=1
 7     while [[ "$j" -le "9" ]]
 8     do
 9         let "multi=$i*$j"
10         if [[ "$j" -gt "$i" ]];then
11             break
12         else
13             echo -n "$i*$j=$multi "
14             let "j+=1"
15         fi
16     done
17     echo
18     let "i+=1"
19 done
20 #执行结果
21 [rhat@localhost shell]$ sh ./nesting02.sh 
22 1*1=1 
23 2*1=2 2*2=4 
24 3*1=3 3*2=6 3*3=9 
25 4*1=4 4*2=8 4*3=12 4*4=16 
26 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
27 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
28 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
29 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
30 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

六、循环控制

  1.break语句

    break用于终止当前循环体。一般情况下,break都是和if判断语句一起使用的.

  eg:上面改造的99乘法表

  2.continue语句

    continue语句用于结束当前循环转而进入下一次循环,这和break不同,break是直接终止当前循环,continue是继续下次循环.

  eg:打印1到100之间的素数

 1 [rhat@localhost shell]$ vim continue02.sh 
 2 #!/bin/bash
 3 for (( i=1;i<=100;i++ ))
 4 do
 5     for ((j=2;j<i;j++))
 6     do
 7         if !(($i%$j));then
 8             continue 2    #2代表跳出循环的嵌套数.
 9         fi
10         done
11         echo -n "$i "
12 done
13 echo
14 #执行结果
15 [rhat@localhost shell]$ sh ./continue02.sh 
16 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

回到顶部

原文地址:https://www.cnblogs.com/xccnblogs/p/4840593.html