zoukankan      html  css  js  c++  java
  • 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 

    回到顶部

  • 相关阅读:
    django-restframework频率功能、过滤功能等相关内容-87
    django-restframework认证功能等相关内容-86
    视图基类、扩展类、子类及试图集等相关内容-85
    vue框架前后端分离项目之课程接口、页面、前台等相关内容-127
    vue框架前后端分离项目之课程页面前端、课程表分析、编写及数据录入等相关内容-126
    celery的基础使用等相关内容-125
    数据库时间戳排序协议
    单节点部署OpenStack(Queens版本、DevStack)
    变量命名规范及str类型
    程序员职业生涯规划
  • 原文地址:https://www.cnblogs.com/xccnblogs/p/4840593.html
Copyright © 2011-2022 走看看