一、for循环语句
1、列表循环
for variable in {list}docommandcommand...done或者for variable in a b cdocommandcommanddoneeg 打印12345#!/bin/bashfor i in {1..5}doecho $idone{10..1..-1} 打印10到1{1..100..2} 打印奇数{0..100..2} 打印偶数seq 10 打印1到10seq 10 -1 1 打印10到1seq 1 2 10 打印奇数
2、不带列表循环
for variabledocommandcommand...done
3、类C风格的for循环
for ((expr1;expr2;expr3))docommandcommand...donefor ((i=1;i<=5;i++))doecho $idoneexpr1:定义变量并赋初值expr2:决定是否进行循环(条件)expr3:决定循环变量如何改变,决定循环什么时候退出
4、循环控制语句
循环体do…done之间的内容
continue:继续,表示循环体内的后面代码不执行,重新下一次循环
break:打断,停止循环,执行循环体后面的语句
exit:直接退出脚本
应用练习:
(一)计算100以内的奇数和
#!/bin/env bashsum=0for i in {1..100..2}dolet sum=$sum+$idoneecho \"1-100奇数和为:$sum\"
(二)判断输入整数是否为质数
#!/bin/env bashread -p \"请输入一个正整数:\" number[ $number -eq 1 ] && echo \"$number不是质数\" && exit[ $number -eq 2 ] && echo \"$number是质数\" && exitfor i in `seq 2 $[$number-1]`do[ $[$number%$i] -eq 0 ] && echo \"$number不是质数\" && exitdoneecho \"$number是质数\"
(三)批量创建用户
#!/bin/env bashgrep -w ^class /etc/group &>/dev/nulltest $? -ne 0 && groupadd classfor ((i=1;i<=5;i++))douseradd -G class u$iecho 123|passwd --stdin u$idone
1、批量新建5个用户stu1~stu5,要求用户的家目录在/rhome
#!/bin/bash[ -f /rhome ] && mv /rhome /rhome.bak || [ ! -d /rhome ] && mkdir /rhomefor ((i=1;i<=5;i++))douseradd -d /rhome/stu$i stu$iecho 123|passwd --stdin stu$idone
2、局域网内脚本检查主机网络通讯
#!/bin/baship=10.1.1for ((i=1;i<=10;i++))doping -c1 $ip.$i &>/dev/nullif [ $? -eq 0 ];thenecho \"$ip.$i is ok\" >> /tmp/ip_up.txtelseecho \"$ip.$i is down\" >> /tmp/ip_down.txtfidone**脚本并发控制**{程序}&表示将程序放入后台执行,等待程序执行完毕进行后面内容,需要wait#!/bin/baship=10.1.1for ((i=1;i<=10;i++))do{ping -c1 $ip.$i &>/dev/nullif [ $? -eq 0 ];thenecho \"$ip.$i is ok\" >> /tmp/ip_up.txtelseecho \"$ip.$i is down\" >> /tmp/ip_down.txtfi}&donewaitecho \"局域网内ip网络检测完毕\"
二、while循环
条件为真进入循环,条件为假退出循环语法结构while 表达式docommand...donewhile [ 1 -eq 1 ] 或者 (( 1 > 2 ))docommandcommand...doneeg 脚本计算1-50偶数和#!/bin/bashsum=0i=2while [ $i -le 50 ]dolet sum=$sum+$ilet i+=2doneecho \"1-50偶数和为:$sum\"脚本同步系统时间#!/bin/env bashNTP=10.1.1.1count=0while truedordate -s $NTP &>/dev/nullif [ $? -ne 0 ];thenecho \"system date failed\" |mail -s \"check system date\" root@loaclhostelselet count++if [$count -eq 100 ];thenecho \"system date success\" |mail -s \"check system date\" root@localhost && count=0fifisleep 30done
三、until循环
条件为假进入循环,条件为真退出循环
语法结构until expression [ 1 -eq 1 ] (( 1>=1 ))docommandcommand...doneeg#!/bin/bashif [ -d /rhome ];thenecho \"/rhome目录已存在\"elsemkdir /rhomeecho \"/rhome不存在,已完成创建\"fii=1until [ $i -gt 10 ]doif [ $i -le 5 ];thenuseradd -u $[1000+$i] stu$iecho 123|passwd --stdin stu$ielseuseradd -d /rhome/stu$i stu$iecho 123|passwd --stdin stu$ifilet i++done