当前位置:   article > 正文

Shell基础之流程循环控制语句

Shell基础之流程循环控制语句

目录

for循环

带列表循环

不带列表循环

类C风格循环

while循环

语法

无限循环

使用示例

until循环

基本语法

示例

select循环

语法格式

嵌套循环

break和continue

break的使用

continue的使用


在shell 中循环有以下几种:

for 循环        

while 循环

until 循环
select 循环
break 和 continue

for循环

        在shell中,for循环有两种情况

带列表循环
不带列表循环

带列表循环

        语法:

  1. for 循环变量 in 列表
  2. do
  3. 执行语句
  4. ...
  5. done

        在语法中,循环变量是每次循环时得到的列表的某一数据,当循环一次结束后,再获取另一个数,然后再执行 do 里面的语句,依此类推,直到列表中数据循环完结

        for 循环中的列表中的数据是以空格来进行分隔的

示例:

        直到列出列表的所有元素

代码示例:

  1. [root@openEuler ~]# cat for1.sh
  2. #!/bin/bash
  3. for var in 192.168.72.130 192.168.72.131 192.168.72.132
  4. do
  5. echo $var
  6. done
  7. [root@openEuler ~]# bash for1.sh
  8. 192.168.72.130
  9. 192.168.72.131
  10. 192.168.72.132

还可以修改如下:

  1. [root@openEuler ~]# cat for1.sh
  2. #!/bin/bash
  3. for var in 192.168.72.13{0..3}
  4. do
  5. echo $var
  6. done
  7. [root@openEuler ~]# bash for1.sh
  8. 192.168.72.130
  9. 192.168.72.131
  10. 192.168.72.132
  11. 192.168.72.133

还可以使用 seq 命令来生成列表数据:

  1. [root@openEuler ~]# cat for1.sh
  2. #!/bin/bash
  3. for var in $(seq -f "192.168.72.13%1g" 1 5)
  4. do
  5. echo $var
  6. done
  7. [root@openEuler ~]# bash for1.sh
  8. 192.168.72.131
  9. 192.168.72.132
  10. 192.168.72.133
  11. 192.168.72.134
  12. 192.168.72.135

         在带列表的 for 循环中,还可以指定循环的步长

语法:

  1. for 循环变量 in {开始..结束..步长}
  2. do
  3. 语句
  4. ....
  5. done

示例:

        循环输入1~10中的奇数

  1. [root@openEuler ~]# cat for2.sh
  2. #!/bin/bash
  3. for v in {1..10..2}
  4. do
  5. echo $v
  6. done
  7. [root@openEuler ~]# bash for2.sh
  8. 1
  9. 3
  10. 5
  11. 7
  12. 9

示例:

        获取根目录下所有文件名作为变量的值打印输出

代码示例:

  1. [root@openEuler ~]# cat for3.sh
  2. #!/bin/bash
  3. for file in $(ls -F / | grep -v /$)
  4. do
  5. echo $file
  6. done
  7. [root@openEuler ~]# bash for3.sh
  8. bin@
  9. lib@
  10. lib64@
  11. sbin@

示例:

        打印出如下的语句中字符数不大于6的单词

        hello world rabbit favorite eat apple cabbage

代码示例:

  1. [root@openEuler ~]# cat for4.sh
  2. #!/bin/bash
  3. for word in hello world rabbit favorite eat apple cabbage
  4. do
  5. if [ `expr length ${word}` -le 6 ]; then
  6. echo $word
  7. fi
  8. done
  9. [root@openEuler ~]# bash for4.sh
  10. hello
  11. world
  12. rabbit
  13. eat
  14. apple

不带列表循环

语法:

  1. for 循环变量
  2. do
  3. 语句
  4. ...
  5. done

示例:

        循环输入所有的参数

代码示例:

  1. [root@openEuler ~]# cat for5.sh
  2. #!/bin/bash
  3. for v in $@
  4. do
  5. echo $v
  6. done
  7. [root@openEuler ~]# bash for5.sh
  8. [root@openEuler ~]# bash for5.sh {1..5}
  9. 1
  10. 2
  11. 3
  12. 4
  13. 5

类C风格循环

语法:

  1. for ((表达式1;表达式2;表达式3))
  2. do
  3. 语句
  4. done

示例:

        批量创建用户,用户名以 test 开头,按数字序号变化,一共添加30个账号,名称如:test01、test02、test03、......、test10、......、test30,用户初始密码为:Abc123456

代码示例:

  1. [root@openEuler ~]# cat for6.sh
  2. #!/bin/bash
  3. for ((i=1;i<=30;i++))
  4. do
  5. if [ $i -lt 10 ]; then
  6. user=test0$i
  7. else
  8. user=test$i
  9. fi
  10. if ! id -u $user &> /dev/null
  11. then
  12. useradd $user
  13. echo "Abc123456" | passwd --stdin $user &> /dev/null
  14. else
  15. echo "$user is exists"
  16. fi
  17. done
  18. [root@openEuler ~]# bash for6.sh
  19. [root@openEuler ~]# grep test /etc/passwd
  20. test01:x:1001:1001::/home/test01:/bin/bash
  21. test02:x:1002:1002::/home/test02:/bin/bash
  22. test03:x:1003:1003::/home/test03:/bin/bash
  23. test04:x:1004:1004::/home/test04:/bin/bash

方式二:

  1. [root@openEuler ~]# cat for7.sh
  2. #!/bin/bash
  3. for u in `seq -f "test%02g" 1 30`
  4. do
  5. if ! id -u $u &>/dev/null
  6. useradd $u
  7. echo "Haha123123" | passwd --stdin $u
  8. fi
  9. done

while循环

语法

  1. while [ 条件表达式 ]
  2. do
  3. 语句
  4. 语句
  5. done

示例:

        循环输出1~10这几个数

代码示例:

  1. [root@openEuler ~]# cat while1.sh
  2. #!/bin/bash
  3. i=1
  4. while [ $i -le 10 ]
  5. do
  6. echo $i
  7. let i++
  8. done

示例:

        使用exec读取指定文件的内容并循环输出,文件内容如下:

  1. [root@openEuler ~]# cat myfile
  2. open
  3. openlab
  4. openlab123
  5. linux
  6. readhat

代码示例:

        

  1. # 第一步创建文件及内容
  2. [root@openEuler ~]# cat > myfile << EOF
  3. > open
  4. > openlab
  5. > openlab123
  6. > linux
  7. > readhat
  8. > EOF
  9. [root@openEuler ~]# cat myfile
  10. open
  11. openlab
  12. openlab123
  13. linux
  14. readhat
  15. # 第二步:编写脚本来实现文件读取并循环输出
  16. [root@openEuler ~]# cat while2.sh
  17. #!/bin/bash
  18. exec < myfile
  19. while read line
  20. do
  21. echo $line
  22. done
  23. [root@openEuler ~]# bash while2.sh
  24. open
  25. openlab
  26. openlab123
  27. linux
  28. readhat

方式二:

  1. [root@openEuler ~]# cat while3.sh
  2. #!/bin/bash
  3. while read line
  4. do
  5. echo $line
  6. done < myfile
  7. [root@openEuler ~]# bash while3.sh
  8. open
  9. openlab
  10. openlab123
  11. linux
  12. readhat

无限循环

        在while的表达式中,可以指定以下几个特殊值:

true会一直循环,而且它的状态返码是0
false不做任何事情,表示成功,状态码为0
作用与true相同,都是进行无限循环

代码示例:

  1. [root@openEuler ~]# while true ; do echo 123123 ; done #会一直循环
  2. [root@openEuler ~]# while false ; do echo 123123 ; done
  3. [root@openEuler ~]# echo $?
  4. 0
  5. [root@openEuler ~]# while : ; do echo 123123 ; done

使用示例

        猜商品的价格,通过变量RANDOM来获取随机的价格,然后提示用户猜价格,并记录次数,猜中退出,或次数达到5次也退出

代码示例:

  1. [root@openEuler ~]# cat while4.sh
  2. #!/bin/bash
  3. price=$[ $RANDOM % 100 ]
  4. time=0
  5. while true
  6. do
  7. read -p 'Please enter product price [0-99]: ' input
  8. let time++
  9. if [ $input -eq $price ]; then
  10. echo 'Good luck, you guessed it.'
  11. echo 'You have guessed $time times.'
  12. exit 0
  13. elif [ $input -gt $price ]; then
  14. echo "$input is to high"
  15. else
  16. echo "$input is to low"
  17. fi
  18. if [ $time -eq 5 ]; then
  19. echo "You have guessed is 5 times. exit"
  20. exit 1
  21. fi
  22. done
  23. [root@openEuler ~]# bash while4.sh
  24. Please enter product price [0-99]: 50
  25. 50 is to low
  26. Please enter product price [0-99]: 80
  27. 80 is to high
  28. Please enter product price [0-99]: 70
  29. 70 is to high
  30. Please enter product price [0-99]: 60
  31. 60 is to low
  32. Please enter product price [0-99]: 65
  33. 65 is to low
  34. You have guessed is 5 times. exit
  35. [root@openEuler ~]#

示例:

        使用while读取文件,文件的内容如下:

  1. 192.168.72.131 22
  2. 192.168.72.132 23
  3. 192.168.72.133 22

要求:

        输出的格式为:

  1. IP: 192.168.72.131, PORT: 22
  2. IP: 192.168.72.132, PORT: 23
  3. IP: 192.168.72.133, PORT: 22

代码示例:

  1. # 1. 创建文件
  2. [root@openEuler ~]# cat ips
  3. 192.168.72.131 22
  4. 192.168.72.132 23
  5. 192.168.72.133 22
  6. # 2. 编写脚本
  7. [root@openEuler ~]# cat while6.sh
  8. #!/bin/bash
  9. while read line
  10. do
  11. IP=`echo $line|cut -d" " -f1` # 也可以使用awk来实现,如:IP=`echo $line|awk '{print $1}'`
  12. PORT=$(echo $line|cut -d " " -f 2)
  13. echo "IP:$IP, PORT:${PORT}"
  14. done < ips
  15. # 3. 运行测试
  16. [root@openEuler ~]# bash while6.sh
  17. IP:192.168.72.131, PORT:22
  18. IP:192.168.72.132, PORT:23
  19. IP:192.168.72.133, PORT:22

until循环

        until循环和while循环的作用是一样的,都重复执行某些代码,但是它和while循环也有区别:until循环是条件不满足时才循环,条件满足则退出;而while循环是条件满足都循环,而条件不满足则退出

基本语法

  1. until [ 条件表达式 ]
  2. do
  3. 要重复执行的语句
  4. done

示例

        循环输出0~10之间的数

代码示例:

  1. [root@openEuler ~]# cat until1.sh
  2. #!/bin/bash
  3. i=0
  4. #while [ $i -lt 10 ]
  5. #do
  6. # echo $i
  7. # let i++
  8. #done
  9. until [ $i -ge 10 ]
  10. do
  11. echo $i
  12. i=$((i+1))
  13. done
  14. [root@openEuler ~]# bash until1.sh
  15. 0
  16. 1
  17. 2
  18. 3
  19. 4
  20. 5
  21. 6
  22. 7
  23. 8
  24. 9

select循环

        select循环语句主要功能是创建选择菜单,在执行带有select循环语句脚本时,会输出按照数字列表

语法格式

  1. select 变量名 [ in 菜单值列表 ]
  2. do
  3. 语句
  4. done

示例:

        选择MySQL版本

代码示例:

  1. [root@openEuler ~]# cat select1.sh
  2. #!/bin/bash
  3. select mysql_version in 5.6 5.7 8.0
  4. do
  5. echo $mysql_version
  6. done
  7. [root@openEuler ~]# bash select1.sh
  8. 1) 5.6
  9. 2) 5.7
  10. 3) 8.0
  11. #? 2
  12. 5.7
  13. #? 3
  14. 8.0
  15. #? ^C

示例:

        选择水果,假如有以下水果可以选择:

        Apple、Banana、Pear、Watermelons、Grape

代码示例:

  1. [root@openEuler ~]# cat select2.sh
  2. #!/bin/bash
  3. echo "Choose your favorite fruit: "
  4. select fruit in Apple Banana Pear Watermelons Grape
  5. do
  6. echo
  7. echo "Your favorite fruit is $fruit."
  8. #break
  9. done
  10. [root@openEuler ~]# bash select2.sh
  11. Choose your favorite fruit:
  12. 1) Apple
  13. 2) Banana
  14. 3) Pear
  15. 4) Watermelons
  16. 5) Grape
  17. #? 1
  18. Your favorite fruit is Apple.
  19. #? 2
  20. Your favorite fruit is Banana.
  21. #? 4
  22. Your favorite fruit is Watermelons.
  23. #? ^C

代码完善:

        在上面示例中,没有办法在选择水果后退出,它会一直让我们进行选择,如果希望选择后退出则需要添加break

  1. [root@openEuler ~]# cat select2.sh
  2. #!/bin/bash
  3. echo "Choose your favorite fruit: "
  4. select fruit in Apple Banana Pear Watermelons Grape
  5. do
  6. echo
  7. echo "Your favorite fruit is $fruit."
  8. break
  9. done
  10. [root@openEuler ~]# bash select2.sh
  11. Choose your favorite fruit:
  12. 1) Apple
  13. 2) Banana
  14. 3) Pear
  15. 4) Watermelons
  16. 5) Grape
  17. #? 3
  18. Your favorite fruit is Pear.
  19. [root@openEuler ~]#

嵌套循环

示例:

        打印九九乘法表

  1. [root@openEuler ~]# cat ninetable.sh
  2. #!/bin/bash
  3. for i in `seq 9`
  4. do
  5. for j in `seq 9`
  6. do
  7. #[ $j -le $i ] && echo -n "$i*$j = `expr $i \* $j` "
  8. [ $j -le $i ] && echo -n "$i*$j = `echo $((i*j))` "
  9. done
  10. echo " "
  11. done
  12. [root@openEuler ~]# bash ninetable.sh
  13. 1*1 = 1
  14. 2*1 = 2 2*2 = 4
  15. 3*1 = 3 3*2 = 6 3*3 = 9
  16. 4*1 = 4 4*2 = 8 4*3 = 12 4*4 = 16
  17. 5*1 = 5 5*2 = 10 5*3 = 15 5*4 = 20 5*5 = 25
  18. 6*1 = 6 6*2 = 12 6*3 = 18 6*4 = 24 6*5 = 30 6*6 = 36
  19. 7*1 = 7 7*2 = 14 7*3 = 21 7*4 = 28 7*5 = 35 7*6 = 42 7*7 = 49
  20. 8*1 = 8 8*2 = 16 8*3 = 24 8*4 = 32 8*5 = 40 8*6 = 48 8*7 = 56 8*8 = 64
  21. 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

示例:

        打印三角形(10行10列)

  1. [root@openEuler ~]# cat triangle.sh
  2. #!/bin/bash
  3. for i in {1..9}
  4. do
  5. for ((col=1;col<10-i;col++))
  6. do
  7. echo -n " "
  8. done
  9. for ((k=1; k<=i; k++))
  10. do
  11. echo -n "$i "
  12. done
  13. echo " "
  14. done
  15. [root@openEuler ~]# bash triangle.sh
  16. 1
  17. 2 2
  18. 3 3 3
  19. 4 4 4 4
  20. 5 5 5 5 5
  21. 6 6 6 6 6 6
  22. 7 7 7 7 7 7 7
  23. 8 8 8 8 8 8 8 8
  24. 9 9 9 9 9 9 9 9 9

break和continue

        break是用于循环退出,而continue是结束本次循环,进入下一次循环

break的使用

示例:

  1. [root@openEuler ~]# cat break.sh
  2. #!/bin/bash
  3. for i in `seq 9`
  4. do
  5. if [ $i -eq 5 ] ; then
  6. break
  7. else
  8. echo $i
  9. fi
  10. done
  11. [root@openEuler ~]# bash break.sh
  12. 1
  13. 2
  14. 3
  15. 4

continue的使用

示例:

  1. [root@openEuler ~]# cat continue.sh
  2. #!/bin/bash
  3. for i in `seq 9`
  4. do
  5. if [ $i -eq 5 ] ; then
  6. continue
  7. else
  8. echo $i
  9. fi
  10. done
  11. [root@openEuler ~]# bash continue.sh
  12. 1
  13. 2
  14. 3
  15. 4
  16. 6
  17. 7
  18. 8
  19. 9

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/834465
推荐阅读
  

闽ICP备14008679号