Fork me on GitHub

Shell之循环结构

一、while循环

 1、语法

while 条件
  do
   指令...
done

2、实例

  • 每隔2s打印系统负载
#!/bin/sh
while true
  do
  printf "`uptime`\n"
  sleep 1
done
  • 计算数字1-100的和
#!/bin/sh
i=100
sum=0
while [ $i -ge 1 ]
 do
  ((sum=sum+i))
  ((i=i-1))
done
echo "$sum"

当然更高效的方式是利用等差数列的公式进行计算。

 3、总结

 while循环的特长是执行守护进程,循环不退出持续执行,可用于秒级的定时任务。补偿crond只能分钟级的不足。

二、for循环

1、语法

for 变量名 in 变量取值列表
    do
    指令...
done

2、实例

  • 打印3、2、1三个数
# 法一

#!/bin/sh
for i in 3 2 1
 do
 echo "$i"
done

# 法二
#!/bin/sh
for i in {3..1}
 do
 echo "$i"
done

# 法三
#!/bin/sh
for i in `seq 3 -1 1`
 do
 echo "$i"
done
  • 计算数字1-100的和
#!/bin/sh
j=0
for((i=0; i<=100;i++))
 do
 ((j=j+i))
done
echo "$j"
  • 判断在线用户

在生产场景中,比如判断10.0.0.0/24网络中,当前在线的用户有哪些?判断思路:(1)ping通在线(2)ping通返回值为0

#!/bin/sh

for i in `seq 254`
do
  ping -c2 10.0.0.$i > /dev/null 2>&1
  if [ $? -eq 0 ]
    then
      echo "10.0.0.0.$i is online" >> ./online.log
    else
      echo "10.0.0.0.$i is offline" >> ./offline.log
  fi
done
  • 批量创建用户
#!/bin/sh

for i in `seq -w 5`
do
   useradd test$i && echo"testpass$i"|passwd --stdin test$i
done

三、循环控制 

上面是while、if循环,但是如果控制循环的走向呢?比如提前终结循环、跳出当次循环等,这里就可以使用:

  • break
  • continue
  • exit

上面三个关键词不仅仅用于控制循环,还可以用于控制if等条件语句。

关键词 说明
break n n表示跳出循环的层数,如果省略n表示跳出整个循环
continue n n表示退到第n层继续循环,如果省略n表示跳过本次循环,忽略本次循环剩下的代码,进入下一次循环
exit n  退出当前shell程序,n为返回值

为了更好的说明三者之间的区别,如下所示实例:

#!/binsh

for((i=0;i<5;i++))
  do
   if [ $i -eq 3 ]
     then
       #continue
       #break
       exit
   fi
    echo $i
done
echo "end"
  • continue的输出
[root@localhost loop]# sh continue.sh 
0
1
2
end
  • break的输出
[root@localhost loop]# sh break.sh 
0
1
2
end
  • exit的输出
[root@localhost loop]# sh exit.sh 
0
1
2

可以看出continue是跳出本次循环,继续下次的循环;break是退出循环,执行后面的代码;exit是直接跳出shell。

 

posted @ 2021-02-07 15:23  iveBoy  阅读(190)  评论(0)    收藏  举报
TOP