Shell for&while&until 循环详细总结(continue和break区别)


前言

mark

不管是哪一门计算机语言,循环都是不可绕开的一个话题,Shell 当然也不是例外。下面总结一些 Shell 脚本里常用的循环相关的知识点,新手朋友可以参考。


 循环语句,主要是为了简化重复动作代码,在运维方面主要用于重复某项动作,例如批量创建用户,在shell中主要有两种 while循环 与 for 循环。

一:shell循环语句

1.1:for 循环

for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。

其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。

for的语法1

for 变量 in 串行
do
   执行命令
done

行1,讲串行中的字段迭代放入变量中

行2-4,接着将重复执行do和done之间的命令区域,直到串行中每一个字段军处理过为止。

流程图

mark

1.11:示例:登录账号第一列
[root@localhost opt]# vim shuzhi.sh
#!/bin/bash
#取值范围
i=1
for shuchu in $(awk -F ':' '{print $1}' /etc/passwd);do
        echo "$i 号用户: $shuchu"
        i=$(expr $i + 1)
        let i++             #都是i+1的效果
done
1.12:示例:姓名列表批量创建账户
#首先在文件里写好创建账号的名称
[root@localhost opt]# cat shuai.txt     
liu2
liu3
liu4
liu5

[root@localhost opt]# vim 1.sh
#!/bin/bash
liu=$(cat /opt/shuai.txt)
#创建全部账户
for null in $liu
do
#添加账户
 useradd $null
#设置密码
 echo "123123" | passwd --stdin $null
 echo "创建${null}完成"
done

[root@localhost opt]# bash 1.sh 
更改用户 liu2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建liu2完成
更改用户 liu3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建liu3完成
更改用户 liu4 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建liu4完成
更改用户 liu5 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建liu5完成
语法2:
for ((初始值;循环控制条件;变量变化)do
程序
done

需要注意以下几点:

  • 初始值:在循环开始时,需要给某个变量赋予初始值,如 i=1。
  • 循环控制条件:用于指定变量循环的次数,如 i<=100,则只要 i 的值小于等于 100,循环就会继续。
  • 变量变化:每次循环之后,变量该如何变化,如 i=i+1,代表每次循环之后,变量的值都加 1。
    语法二和其他语言中的 for 循环类似,也就是事先决定循环次数的固定循环。先举一个简单的例子。
1.13:示例:1加到100求和
[root@localhost opt]# vim jia.sh
#!/bin/bash
#从1加到100
s=0
for((i=1;i<=100;i=i+1))
#定义循环次数100do
s=$(($s+$i))
#每次循环给变量s赋值
done
echo "this sum of 1+2+..+100 is : $s"
#输出从1加到100
[root@localhost opt]# sh jia.sh 
this sum of 1+2+..+100 is : 5050

++ 自身变量+1 – 自身变量-1

lt 可以单独使用 % 自身变量 %5

+=5 自身变量+5 自身变量 %5

-= 自身变量-5 * 自身变量*5

/= 自身变量/5

1.14:100以内不能整除3的数
[root@localhost opt]# vim shuai.sh
#!/bin/bash
i=100
while [ $i -gt 0 ]
do
 if [ `expr $i % 3` -eq 0 ];then
        let i--
        continue
 else
        echo $i
 fi
 let i--
done

方法2:
[root@localhost opt]# vim ji.sh 
#!/bin/bash
i=100
while [ $i -gt 0 ]
do
 if [ ! `expr $i % 3` -eq 0 ];then
        echo $i
 fi
 let i--
done
1.15:shell中let命令

let 对整数进行数学运算

let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

语法格式
let 表达式
或
let "表达式"let '表达式'
以上方式都等价于 ((表达式))
  • 当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号" "或者单引号’ '将表达式包围起来。

  • 和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。

1.2:while循环

while 循环主要用于无限次的循环情况,例如登录认证,你不知道多少次可以登录成功,当然可以认为限制登录次数。

语句结构
while 条件测试操作
do
	命令序列
done
#!/bin/bash
while true
do
	echo "嘿嘿嘿嘿嘿"  #循环体
done

行1,首先进行条件测试,如果传回值为0(条件测试为真),则进入循环,执行命令区域,否则

不进入循环,介绍while 命令

行3,执行命令区域,这些命令中,应该要有改变条件测试的命令,这样,才有机会在

有限步骤后结束执行while循环(除非想要执行无穷循环)。

行4,回到行1,执行while命令

在这里插入图片描述

1.21:使用while循环1-20数字
#!bin/bash
i=0
while [ $i -le 20 ]
do
 echo "$i"
 let i++
done

[root@localhost opt]# sh shu.sh 
0
1
2
3
4
5
6
.....这边为了节省空间就省略一下
1.22:whlie死循环

while true:死循环有时候也有奇效,可与用户交互

#!/bin/bash
while true
do
  read -p "请输入shuai退出:" tt
  if [ $tt = shuai ]
        then
          break
  fi
done
echo "正常退出"
[root@localhost opt]# sh shuaish 
请输入shuai退出:shuai^H^H
请输入shuai退出:^[[4~
请输入shuai退出:1
请输入shuai退出:3
请输入shuai退出:shuai
正常退出
1.23:使用whlie批量添加用户

用户名称以shuai开头,按照顺序进行排序

一共添加了5个账户,即hua1…hua5

#!/bin/bash
a=0
while [ $a -le 5 ]
do
 let a++
 useradd shuai$a
 echo "123123" | passwd --stdin shuai$a &> /dev/null
 echo "shuai$a添加完毕"
done
echo "操作结束"
[root@localhost opt]# sh useradd.sh 
shuai1添加完毕
shuai2添加完毕
shuai3添加完毕
shuai4添加完毕
shuai5添加完毕
shuai6添加完毕
操作结束
[root@localhost opt]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
liu:x:1000:1000:liu:/home/liu:/bin/bash
shuai1:x:1001:1001::/home/shuai1:/bin/bash
shuai2:x:1002:1002::/home/shuai2:/bin/bash
shuai3:x:1003:1003::/home/shuai3:/bin/bash
shuai4:x:1004:1004::/home/shuai4:/bin/bash
shuai5:x:1005:1005::/home/shuai5:/bin/bash
shuai6:x:1006:1006::/home/shuai6:/bin/bash
1.24:10以内所有自然数的平方值 如1*1
[root@localhost opt]# vim 1.sh

#!/bin/bash
num=1                          #设置num的值为1   【这边根据条件取值】
while [ $num -lt 10 ]           #这边就是取值范围了   -lt是小于10 
do
        liu=$(expr $num \* $num)  #这边就是值乘以值就是平方
        echo $liu                 #输出以后
        let num++                 ++就是自身值+1
                                  #或者用 num=$(expr $num + 1 )
done

示例

猜商品价格游戏
通过鼻变量RANDOM获得随机数
提示用户猜测并记录次数,猜中后退出循环

#!/bin/bash
#商品价格
RR=$(expr $RANDOM % 1000)
#猜测次数
i=0
echo "猜价格游戏.."
while true
 do
 read -p "请输入商品价格(0-999):" num
 let i++
 if [ $num -eq $RR ];then
 echo "恭喜猜中了"
 echo "总共猜中了$i"
elif [ $num -gt $RR ];then
 echo "猜高了"
else
 echo "猜低了"
fi
done

1.3:continue和break区别

break 命令可以带一个参数,一个不带参数的break 循环只能退出最内层的循环,而break N可以退出N 层循环
continue 命令也可以带一个参数,一个不带参数的continue 命令只去掉本次循环的剩余代码,而continue N 将会把N 层循环剩余的代码都去掉,但是循环的次数不变
#!/bin/sh  
for i in "a b c d" 
 do   
 echo "$i "
 for j in `seq 10`  
    do  
      if [ $j -eq 5 ];then 
        break  
      fi  
      echo "$j "
    done
 echo  
 done  
break结果:
a 1 2 3 4 
b 1 2 3 4 
c 1 2 3 4 
d 1 2 3 4 
break 2的结果:
a 1 2 3 4 
continue结果:
a 1 2 3 4 6 7 8 9 10 
b 1 2 3 4 6 7 8 9 10 
c 1 2 3 4 6 7 8 9 10 
d 1 2 3 4 6 7 8 9 10
continue 2的结果:
a 1 2 3 4 
b 1 2 3 4 
c 1 2 3 4 
d 1 2 3 4 

1.4:untli循环语句

重复测试某个条件,只要条件不成立则反复执行

until 条件测试操作
do
 命令序列
done
while 未超过20
do
 数字依次增加
done:

行1,如果条件测试结果为假(传回值不为0),就进入循环。

行3,执行命令区域。这些命令中,应该有改变条件测试的命令,这样子,才有机会在有限步骤后结束执行until 循环(除非你想要执行无穷循环)。

行4,回到行1,执行until命令

mark

1.41:计算1-20的和

通过循环累计的方式计算1-20的和

until跟whlie相反是命令不成立就会进入循环=whlie前面加!

#!/bin/bash
k=1
s=0
until [ $k -eq 21 ]     '当取值为21就会成立就不会进入循环'
do
 let s+=$k
 let k++
done
echo "和:$s"
1.42:until语句应用2

为指定用户发送在线消息

  • 若指定用户不在线(未登陆系统),则每10分钟(实验中
  • 为了测试效果,可改为5s)试一次,直至用户登录系统后再发送信息
  • 用户名与消息通过为止参数传递给脚本
#!/bin/bash
username=$1
#判断格式参数是否为空
if [ $# -lt 1 ]
 then
 echo "Usage:`basename $0` <username> [<message>]"
 exit 1
fi
#判断账号是否存在
if grep "^$username:" /etc/passwd &> /dev/nell;then :
  else
        echo "用户不存在"
        exit 2
fi
#判断用户是否在线
until who | grep "$username" &> /dev/null
do
        echo "用户不在线,正在尝试连接"
        sleep 5
done
------------------------------------------------


`basename $0`值显示当前脚本或命令的名字
Message:定义发送内容
#可以看出liu用户是在线的
[root@localhost opt]# who | grep liu
liu      :1           2020-07-21 00:07 (:1)
#验证格式
[root@localhost opt]# bash test.sh 
Usage:test.sh <username> [<message>]
#测试不存在用户
[root@localhost opt]# sh test.sh lishan
用户不存在
#用户不在线时
[root@localhost opt]# ./mes.sh liu
用户不在线,正在尝试连接
用户不在线,正在尝试连接
用户不在线,正在尝试连接

看完的都是真爱,点个赞再走呗宝贝?


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值