Shell循环(三)
while循环和until循环
while循环
- 主要用来重复执行一组命令或语句,常用于守护进程或持续运行的程序,循环次数可以固定也可以不固定。
- 语法结构:
while 条件语句
do循环体
done
- while循环语句会对条件测试进行判断,如果条件测试成立时,则执行do和done之间的循环体,直到条件测试不成立时停止循环。
- 逻辑图
until循环
- 语法结构:
unitl 条件测试
do循环体
done
- 在条件表达式不成立时,进入循环体执行指令,条件表达式成立时,终止循环。
循环语句案例实战
while循环语句实现批量用户创建
[root@localhost ~]# vim while_create_user.sh
#!/bin/bash
while read line
doif [ ${#line} -eq 0 ];thenecho "----------------------------------"#exit#breakcontinuefiuser=`echo $line|awk '{print $1}'`pass=`echo $line|awk '{print $2}'`id $user &>/dev/nullif [ $? -eq 0 ];thenecho "user $user already exists."elseuseradd $userecho "$pass" |passwd --stdin $user &>/dev/nullif [ $? -eq 0 ];thenecho "$user is created."fifi
done < user1.txt
[root@localhost ~]# cat user1.txt
test1
wjp1
执行结果如下:
[root@localhost ~]# ./while_create_user.sh
[root@localhost ~]# cat user1.txt
test1
wjp1
[root@localhost ~]# ./while_create_user.sh user1.txt
user test1 already exists.
user wjp1 already exists.
while循环语句和until循环语句测试远程主机连接
while循环语句测试远程主机连接
#!/bin/bash
ip=192.168.40.116 //该ip无法连通,如果可以连通则一直循环
while ping -c1 -W1 $ip &>/dev/null
dosleep=1
done
echo "$ip is down!"
执行结果如下:
[root@localhost ~]# ./while_conn_test.sh
192.168.40.116 is down!
until循环语句测试远程主机连接
[root@localhost ~]# cat until_conn_test.sh
#!/bin/bash
ip=192.168.40.16 //该ip无法ping通,则执行陷入循环;如果ip能够ping通则直接退出该脚本
until ping -c1 -W1 $ip &>/dev/null
dosleep 1
done
执行结果如下:
[root@localhost ~]# ./until_conn_test.sh
^C^C
for、while、until对比
- while和until均可采用类似for循环的语法格式,但while更擅长逐行处理文件。
for循环ping脚本
[root@localhost ~]# vim for_while_until_ping.sh
#!/bin/bash
for i in {2..254}
do{ip=192.168.40.$iping -c1 -W1 $ip &>/dev/nullif [ $? -eq 0 ];thenecho "success"fi}&
done
wait
echo "all finish..."
执行结果如下所示:
[root@localhost ~]# ./for_while_until_ping.sh
success
success
success
success
all finish...
while循环ping脚本
[root@localhost ~]# vim while_ping.sh
#!/bin/bash
i=2
while [ $i -le 254 ]
do{ip=192.168.40.$iping -c1 -W1 $ip &>/dev/nullif [ $? -eq 0 ];thenecho "$ip is up."fi}&let i++
done
wait
echo "all finish..."
执行结果如下所示:
[root@localhost ~]# ./while_ping.sh
192.168.40.2 is up.
192.168.40.10 is up.
192.168.40.136 is up.
192.168.40.156 is up.
all finish...
until循环ping脚本
[root@localhost ~]# vim until_ping.sh
#!/bin/bash
i=2
until [ $i -gt 254 ]
do{ip=192.168.40.$iping -c1 -W1 $ip &>/dev/nullif [ $? -eq 0 ];thenecho "$ip is up."fi}&let i++
done
wait
echo "all finish."
执行结果如下所示:
[root@localhost ~]# ./until_ping.sh
192.168.40.2 is up.
192.168.40.10 is up.
192.168.40.136 is up.
192.168.40.156 is up.
all finish.