当前位置:   article > 正文

五、流程控制之循环

五、流程控制之循环

目录

5.1 步进循环语句for

5.1.1 带列表的for循环语句

5.1.2 不带列表的for循环语句

5.1.3 类C风格的for循环语句

5.2 while循环语句

5.2.1 while循环读取文件

5.2.2 while循环语句示例

5.3 until循环语句

5.4 select循环语句

5.5 嵌套循环


5.1 步进循环语句for

for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。

5.1.1 带列表的for循环语句

带列表的for循环通常用于将一组语句执行已知的次数,其基本语法如下:

  1. for variable in list
  2. do
  3. statement1
  4. statement2
  5. ...
  6. done

在上面的语法中,variable称为循环变量,list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开。do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句。for循环体的执行次数与list中元素的个数有关。在带列表的for语句执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体;当循环体中的语句执行完毕之后,Shell会将列表中的第2个元素的值赋给变量variable,然后再次执行循环体。当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句。

示例1:直接列出变量列表所有元素

  1. 方法1:直接列出元素方法
  2. [root@kittod ~]# cat list.sh
  3. #!/bin/bash
  4. for IP in 192.168.132.128 192.168.132.129
  5. do
  6. echo $IP
  7. done
  8. [root@kittod ~]# chmod +rx list.sh
  9. [root@kittod ~]# ./list.sh
  10. 192.168.132.128
  11. 192.168.132.129
  12. 方法2:使用大括号
  13. [root@kittod ~]# cat list2.sh
  14. #!/bin/bash
  15. for IP in 192.168.132.12{8..9}
  16. do
  17. echo $IP
  18. done
  19. [root@kittod ~]# chmod a+rx list2.sh
  20. [root@kittod ~]# ./list2.sh
  21. 192.168.132.128
  22. 192.168.132.129
  23. 方法3:使用seq
  24. [root@kittod ~]# cat list3.sh
  25. #!/bin/bash
  26. for IP in $(seq -f "192.168.132.12%1g" 1 5)
  27. do
  28. echo $IP
  29. done
  30. [root@kittod ~]# chmod a+rx list3.sh
  31. [root@kittod ~]# ./list3.sh
  32. 192.168.132.121
  33. 192.168.132.122
  34. 192.168.132.123
  35. 192.168.132.124
  36. 192.168.132.125
  37. 说明:seq的用法如下
  38. [root@kittod ~]# seq 1 5
  39. 1
  40. 2
  41. 3
  42. 4
  43. 5
  44. [root@kittod ~]# seq 1 2 10
  45. 1
  46. 3
  47. 5
  48. 7
  49. 9
  50. 选项:
  51. -s 指定输出的分隔符,默认为\n,即默认为回车换行
  52. [root@kittod ~]# seq -s + 1 10
  53. 1+2+3+4+5+6+7+8+9+10
  54. [root@kittod ~]# seq -s "`echo -e "\t"`" 9 11 #echo -e启用转译字符
  55. 9 10 11
  56. -w 指定为定宽输出,不能和-f一起用
  57. [root@kittod ~]# seq -w 8 11
  58. 08
  59. 09
  60. 10
  61. 11
  62. [root@kittod ~]# seq -w 99 103
  63. 099
  64. 100
  65. 101
  66. 102
  67. 103
  68. -f 按照指定的格式输出,不能和-w一起使用,在没有使用-f选项指定格式时,默认格式为%g,类似于printf
  69. [root@kittod ~]# seq 8 11
  70. 8
  71. 9
  72. 10
  73. 11
  74. [root@kittod ~]# seq -f '%g' 8 11
  75. 8
  76. 9
  77. 10
  78. 11
  79. [root@kittod ~]# seq -f '%3g' 8 11
  80. 8
  81. 9
  82. 10
  83. 11
  84. [root@kittod ~]# seq -f '%03g' 8 11
  85. 008
  86. 009
  87. 010
  88. 011
  89. [root@kittod ~]# seq -f "dir%g" 1 5
  90. dir1
  91. dir2
  92. dir3
  93. dir4
  94. dir5
  95. [root@kittod ~]# mkdir $(seq -f 'dir%03g' 1 10)
  96. [root@kittod ~]# ll
  97. total 10
  98. drwxr-xr-x. 2 root root 6 May 4 15:59 dir001
  99. drwxr-xr-x. 2 root root 6 May 4 15:59 dir002
  100. drwxr-xr-x. 2 root root 6 May 4 15:59 dir003
  101. drwxr-xr-x. 2 root root 6 May 4 15:59 dir004
  102. drwxr-xr-x. 2 root root 6 May 4 15:59 dir005
  103. drwxr-xr-x. 2 root root 6 May 4 15:59 dir006
  104. drwxr-xr-x. 2 root root 6 May 4 15:59 dir007
  105. drwxr-xr-x. 2 root root 6 May 4 15:59 dir008
  106. drwxr-xr-x. 2 root root 6 May 4 15:59 dir009
  107. drwxr-xr-x. 2 root root 6 May 4 15:59 dir010

示例2:获取当前目录下的文件名作为变量列表打印输出

  1. [root@kittod ~]# cat list4.sh
  2. #!/bin/bash
  3. for FILE in $(ls -F | grep -v /$) #ls -F 表明查看一个文件,/$表示以/结尾
  4. do
  5. echo $FILE
  6. done
  7. [root@kittod ~]# chmod a+rx list4.sh
  8. [root@kittod ~]# ./list4.sh
  9. list2.sh
  10. list3.sh
  11. list4.sh
  12. list.sh
  13. 说明:
  14. [root@kittod ~]# ls -F / | grep -v /$
  15. bin@
  16. lib@
  17. lib64@
  18. sbin@

示例3:打印出下面语句中字符数不大于6的单词

rabbit is favorite to eat cabbage

  1. [root@kittod ~]# cat 3.sh
  2. #!/bin/bash
  3. for n in rabbit is favorite to eat cabbage
  4. do
  5. if [ `expr length $n` -le 6 ];then
  6. echo $n
  7. fi
  8. done
  9. [root@kittod ~]# chmod a+rx 3.sh
  10. [root@kittod ~]# ./3.sh
  11. rabbit
  12. is
  13. to
  14. eat

Shell允许用户指定for语句的步长。当用户需要另外指定步长时,其基本语法如下:

  1. for varibale in {start..end..step}
  2. do
  3. statement1
  4. statement2
  5. ...
  6. done

示例:通过for循环,计算100以内奇数的和

  1. [root@kittod ~]# cat 4.sh
  2. #!/bin/bash
  3. sum=0
  4. for i in {1..100..2}
  5. do
  6. let "sum+=i"
  7. done
  8. echo "the sum is $sum"
  9. [root@kittod ~]# chmod a+rx 4.sh
  10. [root@kittod ~]# ./4.sh
  11. the sum is 2500
  12. let用法:
  13. 应用变量时不需要使用$
  14. [root@kittod ~]# no1=2
  15. [root@kittod ~]# no2=4
  16. [root@kittod ~]# let result=no1+no2
  17. [root@kittod ~]# echo $result
  18. 6
  19. 自加:
  20. [root@kittod ~]# let no1++
  21. [root@kittod ~]# echo $no1
  22. 3
  23. 自减:
  24. [root@kittod ~]# let no1--
  25. [root@kittod ~]# echo $no1
  26. 2
  27. [root@kittod ~]# a=2
  28. [root@kittod ~]# let "a+=1"
  29. [root@kittod ~]# echo $a
  30. 3
  31. [root@kittod ~]# let "a-=1"
  32. [root@kittod ~]# echo $a
  33. 2
  34. [root@kittod ~]# let "a*=2"
  35. [root@kittod ~]# echo $a
  36. 4
  37. [root@kittod ~]# let "a/=2"
  38. [root@kittod ~]# echo $a
  39. 2
  40. [root@kittod ~]# let "a=$a**3"
  41. [root@kittod ~]# echo $a
  42. 8

5.1.2 不带列表的for循环语句

在某些特殊情况下,for循环的条件列表可以完全省略,称为不带列表的for循环语句。如果没有为for循环提供条件列表,Shell将从命令行获取条件列表。不带列表的for循环语句的一般语法如下:

  1. for variable
  2. do
  3. statement1
  4. statement2
  5. ...
  6. done

由于系统变量$@同样可以获取所有的参数,所以以上的语法等价于以下语法:

  1. for variable in $@$*
  2. do
  3. statement1
  4. statement2
  5. ...
  6. done

示例:

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

5.1.3 类C风格的for循环语句

  1. for ((expression1;expression2;expression3))
  2. do
  3. statement1;
  4. statement2;
  5. ...
  6. done

在上面的语法中,for循环语句的执行条件被2个圆括号包括起来。执行条件分为3个部分,由2个分号隔开,第1部分expression1通常是条件变量初始化的语句;第2部分expression2是决定是否执行for循环的条件。当expression2的值为0时,执行整个循环体;当expression2的值为非0时,退出for循环体。第3部分,即表达式expression3通常用来改变条件变量的值,例如递增或者递减等。

示例1:批量创建用户:

用户名以test开头,按数字序号变化;

一共添加30个账号,即test01,tes02...,test30

用户初始密码为123456

  1. 分析:
  2. 根据要求使用循环语句完成
  3. 创建用户使用useradd命令,根据命名规则,10以下的需要加0
  4. 初始账号设置方法(echo “123456” |passwd –stdin username)

解答:

  1. [root@kittod ~]# cat add_user.sh
  2. #!/bin/bash
  3. for ((i=1;i<=30;i++))
  4. do
  5. if [ $i -lt 10 ]
  6. then
  7. user=test0$i
  8. else
  9. user=test$i
  10. fi
  11. if ! id -u $user &> /dev/null
  12. then
  13. useradd $user
  14. echo "12456" | passwd --stdin $user &> /dev/null
  15. else
  16. echo "$user is exists..."
  17. fi
  18. done
  19. [root@kittod ~]# bash add_user.sh
  20. [root@kittod ~]# grep test /etc/passwd | cut -d ":" -f1
  21. test01
  22. test02
  23. test03
  24. test04
  25. test05
  26. test06
  27. test07
  28. test08
  29. test09
  30. test10
  31. test11
  32. test12
  33. test13
  34. test14
  35. test15
  36. test16
  37. test17
  38. test18
  39. test19
  40. test20
  41. 注意:可以简化写法,直接用for带列表的循环,这样就不用for里面嵌套if判断
  42. 比如for i in {01..30}

示例2:编写一个 Shell 程序,实现判断当前网络(假定为192.168.1.0/24,根据实际情况实现)里,当前在线用户的IP有哪些。

  1. [root@kittod ~]# cat online_host.sh
  2. #!/bin/bash
  3. for ((i=1;i<=254;i++))
  4. do
  5. if ping -c 1 192.168.132.$i &> /dev/null
  6. then
  7. echo "192.168.132.$i is up..."
  8. else
  9. echo "192.168.132.$i is unknown..."
  10. fi
  11. done

5.2 while循环语句

while循环是另外一种常见的循环结构。使用while循环结构,可以使得用户重复执行一系列的操作,直到某个条件的发生。这听起来好像跟until循环非常相似,但是与until语句相比,while语句有着较大的区别。

while循环语句的基本语法如下:

  1. while expression
  2. do
  3. statement1
  4. statement2
  5. ...
  6. done

在上面的语法中,expression表示while循环体执行时需要满足的条件。虽然可以使用任意合法的Shell命令,但是,通常情况下,expression代表一个测试表达式,当expression的值为0时才执行循环体中的语句,每次执行到done时就会重新判断while条件表达式是否成立,当expression的值为非0值时,将退出循环体。与其他的循环结构一样,do和done这2个关键字之间的语句构成了循环体。

5.2.1 while循环读取文件

  1. 方法一:采用exec读取文件,然后进入while循环处理
  2. [root@kittod ~]# cat file
  3. shuju1
  4. shuju2
  5. shuju3
  6. shuju4
  7. [root@kittod ~]# cat file.sh
  8. #!/bin/bash
  9. exec < file
  10. while read a #read是按行赋值给a
  11. do
  12. echo $a
  13. done
  14. [root@kittod ~]# bash file.sh
  15. shuju1
  16. shuju2
  17. shuju3
  18. shuju4
  19. 方法二:使用cat读文件,然后通过管道进入while循环处理
  20. #!/bin/bash
  21. cat file | while read line
  22. do
  23. echo $line
  24. done
  25. 方法三:通过在while循环结尾,使用输入重定向方式
  26. while read line
  27. do
  28. echo $line
  29. done < File

5.2.2 while循环语句示例

示例1:猜商品价格

通过变量RANDOM获得随机数价格

提示用户猜测并记录次数,猜中后退出循环

  1. 分析: 产生随机数价格 猜中退出循环,显然要用死循环(while true),满足条件退出程序
  2. 通过if条件判断,根据用户输入数值和生成随机数比较 记录猜测次数,每猜测一次加1

解答:

  1. [root@kittod ~]# cat price.sh
  2. #!/bin/bash
  3. PRICE=$[ $RANDOM % 100 ] #$RANDOM 生成一个随机数
  4. TIMES=0
  5. while true #注意:此处要写ture不能写1
  6. do
  7. read -p "Please enter the product price [0-99] : " INT
  8. let TIMES++
  9. if [ $INT -eq $PRICE ]
  10. then
  11. echo "Good luck,you guessed it."
  12. echo "You have guessed $TIMES times."
  13. exit 0
  14. elif [ $INT -gt $PRICE ]
  15. then
  16. echo "$INT is too high"
  17. else
  18. echo "$INT is too low"
  19. fi
  20. done
  21. [root@kittod ~]# bash price.sh
  22. Please enter the product price [0-99] : 80
  23. 80 is too low
  24. Please enter the product price [0-99] : 40
  25. 40 is too low
  26. Please enter the product price [0-99] : 90
  27. 90 is too high
  28. Please enter the product price [0-99] : 85
  29. 85 is too low
  30. Please enter the product price [0-99] : 88
  31. 88 is too high
  32. Please enter the product price [0-99] : 87
  33. 87 is too high
  34. Please enter the product price [0-99] : 86
  35. Good luck,you guessed it.
  36. You have guessed 7 times.
  37. 通用的算法公式%random%%%(max-min+1)+min来产生[min,max]区间里的随机数,最大值
  38. 和最小值均能取到。

示例2:while读取文件

工作过程中遇到要从一个ip列表中获取ip port,然后ssh ip 到目标机器进行特定的操作

  1. [root@kittod ~]# cat iplist
  2. 192.168.132.128 22
  3. 192.168.132.129 22
  4. 192.168.132.130 22
  5. [root@kittod ~]# cat ssh_port.sh
  6. #!/bin/bash
  7. while read line
  8. do
  9. IP=$(echo $line |awk '{print $1}') #awk '{print $1}' 截取并打印第一列
  10. PORT=$(echo $line | awk '{print $2}') #awk '{print $2}' 截取并打印第二列
  11. echo "IP: $IP, PORT: $PORT"
  12. done < iplist #将iplist中的数据进行循环
  13. [root@kittod ~]# bash ssh_port.sh
  14. IP: 192.168.132.128, PORT: 22
  15. IP: 192.168.132.129, PORT: 22
  16. IP: 192.168.132.130, PORT: 22
  17. 注意:
  18. [root@kittod ~]# cat ssh_port.sh
  19. #!/bin/bash
  20. while read line
  21. do
  22. IP=$(echo $line |awk '{print $1}')
  23. PORT=$(echo $line | awk '{print $2}')
  24. echo "IP: $IP, PORT: $PORT"
  25. ssh root@$IP
  26. done < iplist
  27. [root@kittod ~]# bash ssh_port.sh
  28. IP: 192.168.132.128, PORT: 22
  29. Pseudo-terminal will not be allocated because stdin is not a terminal.
  30. The authenticity of host '192.168.132.128 (192.168.132.128)' can't be
  31. established.
  32. ECDSA key fingerprint is
  33. SHA256:Rwf0ESUa0h81yrog0NwU5f1rFuE9PJ1iByFEfwlKWKk.
  34. Are you sure you want to continue connecting (yes/no/[fingerprint])?
  35. yes
  36. Warning: Permanently added '192.168.132.128' (ECDSA) to the list of
  37. known hosts.
  38. root@192.168.132.128's password:
  39. -bash: line 1: 192.168.132.129: command not found
  40. -bash: line 2: 192.168.132.130: command not found
  41. 如果在while循环中调用了ssh命令,那么ssh就会把当前输入中所有的数据读走,也就是重定
  42. 向给while命令的数据,都被ssh命令读走了,以至于下次循环的时候,read读到的内容为
  43. 空,导致循环提前结束。

示例3:将之前用for语句创建的test01-test30用户删除

  1. [root@kittod ~]# cat del_user.sh
  2. #!/bin/bash
  3. i=1
  4. while [ $i -le 20 ]
  5. do
  6. if [ $i -lt 10 ]
  7. then
  8. user=test0$i
  9. else
  10. user=test$i
  11. fi
  12. if id -u $user &> /dev/null #id -u显示用户id
  13. then
  14. userdel -r $user
  15. else
  16. echo "$user is not exists..."
  17. fi
  18. let i++
  19. done
  20. 注意:while判断变量也可以使用(()),比如while ((i<=20))

5.3 until循环语句

until循环语句同样也存在于多种程序设计语言中。顾名思义,until语句的作用是将循环体重复执行,直到某个条件成立为止。until语句的基本语法如下:

  1. until expression #表达式为假时执行
  2. do
  3. statement1
  4. statement2
  5. ...
  6. done

条件为假的时候执行

在上面的语法中,expression是一个条件表达式。当该表达式的值不为0时,将执行do和done之间的语句;当expression的值为0时,将退出until循环结构,继续执行done语句后面的其它的语句。

示例:将之前用for语句创建的test01-test30用户删除

  1. [root@kittod ~]# cat del_user2.sh
  2. #!/bin/bash
  3. i=1
  4. until [ $i -gt 20 ] #与while循环类似但是为假的时候执行
  5. do
  6. if [ $i -le 9 ]
  7. then
  8. user=test0$i
  9. else
  10. user=test$i
  11. fi
  12. if id -u $user &> /dev/null
  13. then
  14. userdel -r $user
  15. else
  16. echo "$user is not exists..."
  17. fi
  18. let i++
  19. done

5.4 select循环语句

select循环语句的主要功能是创建菜单,在执行带有select循环语句脚本时,输出会按照数字顺序的列表显示一个菜单,并显示提示符(默认是#?),同时等待用户输入数字选择。

select语句的基本语法如下:

  1. select 变量名 [ in 菜单值列表 ]
  2. do
  3. statement1
  4. statement2
  5. ...
  6. done

示例:

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

select可以快速创建菜单

5.5 嵌套循环

在程序设计语言中,嵌套的循环也是一种非常常见的结构。Shell同样也支持嵌套循环。通过嵌套循环,可以完成更复杂的功能。

示例1:打印九九乘法表

  1. [root@kittod ~]# cat 99.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 "$j*$i = `echo $(($j*$i))` "
  8. done
  9. echo " "
  10. done
  11. [root@kittod ~]# bash 99.sh
  12. 1*1 = 1
  13. 1*2 = 2 2*2 = 4
  14. 1*3 = 3 2*3 = 6 3*3 = 9
  15. 1*4 = 4 2*4 = 8 3*4 = 12 4*4 = 16
  16. 1*5 = 5 2*5 = 10 3*5 = 15 4*5 = 20 5*5 = 25
  17. 1*6 = 6 2*6 = 12 3*6 = 18 4*6 = 24 5*6 = 30 6*6 = 36
  18. 1*7 = 7 2*7 = 14 3*7 = 21 4*7 = 28 5*7 = 35 6*7 = 42 7*7 = 49
  19. 1*8 = 8 2*8 = 16 3*8 = 24 4*8 = 32 5*8 = 40 6*8 = 48 7*8 = 56 8*8 = 64
  20. 1*9 = 9 2*9 = 18 3*9 = 27 4*9 = 36 5*9 = 45 6*9 = 54 7*9 = 63 8*9 = 72 9*9 = 81

示例2:打印三角形

  1. 使用双层循环
  2. 外层循环控制输出行数i:1-10
  3. 内层循环:
  4. 第一个循环打印每行空格j
  5. 第二个循环打印数字k
  6. i(取值) 1 2 3 ... 9
  7. j(个数) 9 8 7 1 j<=10-i
  8. k(个数) 1 2 3 9 k<=i

解答:

  1. [root@kittod ~]# cat sjx.sh
  2. #!/bin/bash
  3. for ((i=1;i<10;i++))
  4. do
  5. for ((j=1;j<10-i;j++))
  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@kittod ~]# bash sjx.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

示例3:打印杨辉三角

  1. 分析:杨辉三角
  2. 1
  3. 1 1
  4. 1 2 1
  5. 1 3 3 1
  6. 1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1
  7. 2、第n行的数字个数为n个。   
  8. 3、第n行数字和为2^(n-1)。(2的(n-1)次方)   
  9. 4、每个数字等于上一行的左右两个数字之和。
  10. 5、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是
  11. 2n个斐波那契数。将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数……这些数之
  12. 和是第2n-1个斐波那契数。   
  13. 6、第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2/2,第四个数
  14. 1×(n-1)×(n-2/2×(n-3/3…依此类推。   
  15. 7.两个未知数和的n次方运算后的各项系数依次为杨辉三角的第(n+1)行。

解答:

  1. [root@localhost test5]# vim yanghui.sh
  2. #!/bin/bash
  3. if (test -z $1)
  4. then
  5. read -p "Input Max Lines:" MAX
  6. else
  7. MAX=$1
  8. fi
  9. i=1
  10. while [ $i -le $MAX ] #i行控制
  11. do
  12. j=1
  13. while [ $j -le $i ] #j列控制
  14. do
  15. f=$[i-1] #f=i-1 这是另一种计算写法。
  16. g=$[j-1] #g=j-1 这是另一种计算写法。
  17. if [ $j -eq $i ] || [ $j -eq 1 ] ; then
  18. declare SUM_${i}_$j=1 #声明变量 头尾都是1
  19. else
  20. declare A=$[SUM_${f}_$j] #取上一行的j列变量
  21. declare B=$[SUM_${f}_$g] #取上一行的j-1列变量
  22. declare SUM_${i}_$j=`expr $A + $B` #声明并计算当前变量
  23. 的值
  24. fi
  25. echo -en $[SUM_${i}_$j]" " #输出当前变量
  26. let j++
  27. done
  28. echo #换行
  29. let i++
  30. done
  31. [root@localhost test5]# bash yanghui.sh
  32. Input Max Lines:4
  33. 1
  34. 1 1
  35. 1 2 1
  36. 1 3 3 1

5.4 利用break和continue语句控制循环

在Shell中的循环结构中,还有2个语句非常有用,即break和continue语句。前者用于立即从循环中退出;而后者则用来跳过循环体中的某些语句,继续执行下一次循环。

break语句的作用是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中。

continue语句则比较有趣,它的作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行。

示例:

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

练习:

  1. 1. 使用case实现成绩优良差的判断
  2. 2. for创建20用户
  3. 用户前缀由用户输入
  4. 用户初始密码由用户输入
  5. 例如:test01,test10
  6. 3. for ping测试指网段的主机网段由用户输入,例如用户输入192.168.2 ,则ping 192.168.2.10 ---192.168.2.20
  7. UP/tmp/host_up.txt
  8. Down: /tmp/host_down.txt
  9. 4. 使用for实现批量主机root密码的修改成功或失败都必须记录
  10. 提示:主机IP存放在一个文件中
  11. SSH:实现公钥认证,执行远程中主机命令
  12. 实现公钥认证
  13. # ssh-keygen 在用于管理的主上生成密钥对
  14. # ssh-copy-id -i 192.168.2.3

1. 使用case实现成绩优良差的判断

  1. #!/usr/bin/env bash
  2. read -p "输入成绩:" num
  3. case $num in
  4. [0-5][0-9])
  5. echo "不及格"
  6. ;;
  7. [6-7][0-9])
  8. echo "良好"
  9. ;;
  10. [8-9][0-9] |100)
  11. echo "优秀"
  12. ;;
  13. esac

2. for创建20用户

用户前缀由用户输入

用户初始密码由用户输入

例如:test01,test10

  1. #!/bin/bash
  2. read -p "请输入用户前缀:" user
  3. read -p "请输入初始密码:" pass
  4. for ((i=1;i<=20;i++ ))
  5. do
  6. if [ $i -lt 10 ];then
  7. users=${user}0$i
  8. else
  9. users=${user}$i
  10. fi
  11. if ! id -u $users &> /dev/null
  12. then
  13. useradd $users
  14. echo "$pass" | passwd --stdin $users &> /dev/null
  15. else
  16. echo "$users is exists..."
  17. fi
  18. done

3. for ping测试指网段的主机网段由用户输入,例如用户输入192.168.2 ,则ping 192.168.2.10 ---192.168.2.20

UP: /tmp/host_up.txt

Down: /tmp/host_down.txt

  1. #!/bin/bash
  2. read -p "请输入网段: " ip
  3. for ((i=10;i<=20;i++))
  4. do
  5. IP="$ip"."$i"
  6. echo $IP
  7. if ping -c 2 $IP &> /dev/null
  8. then
  9. echo "$IP is up" >>/tmp/host_up.txt
  10. else
  11. echo "$IP is down" >>/tmp/host_down.txt
  12. cat
  13. fi
  14. done

4. 使用for实现批量主机root密码的修改成功或失败都必须记录

提示:主机IP存放在一个文件中

SSH:实现公钥认证,执行远程中主机命令实现公钥认证

# ssh-keygen 在用于管理的主上生成密钥对

# ssh-copy-id -i 192.168.2.3

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

闽ICP备14008679号