for循环 whil语句,循环控制语句

网友投稿 252 2022-11-04

for循环 whil语句,循环控制语句

一  for循环语法

在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的 对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态。当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重。

一 for循环语法

1、语法结构

(1)列表循环

(2)不带列表循环

(3)类C风格的for循环

(1)列表循环

for 变量名 in {list}

do

command

done

for i in {a..c}

do

echo $i

done

for i in {1..5}    //{}里面不识别变量

do

echo $i

done

​例2:打印abcde

附1小技巧:花括号{}和seq在for循环的应用:

for i in {1..50..2} 1-50的奇数

for i in {2..50..2} 1-50的偶数

for i in {10..1}  1-10倒序排列

for i in $(seq 10)  1-10正序排列

for i in $(seq 10 -1 1) 1-10倒序排列

for i in $(seq 1 2 10) 1-10的奇数,中间为步长

for i in $(seq 0 2 10) 1-10的偶数,中间为步长

例子

for i in $(seq 0 2 10);do  echo $i ;done

(2)不带列表循环执行时由用户指定参数和参数的个数决定的

for 变量名

do

command

done

例1:打印hello

第一种:

[root@server ~]# vim for2.sh

#!/bin/bash

for i

do

echo hello

done

[root@server ~]# . /a.sh   //没有给脚本传参所以执行了没有结果

[root@server ~]# . /a.sh a   //把a赋值给变量i,i有值了它就开始执行do..done了

hello

第二种:

for i

do

echo $i

done

[root@client ~]# bash a.sh hello

hello

(3)类C风格的for循环

for ((expr1;expr2;expr3))do commanddoneexpr1:定义变量并赋初值expr2:决定是否循环expr3:决定循环变量如何改变,决定循环什么时候退出例1:打印1-5迭代[root@server ~]# vim a.sh#!/bin/bashfor ((i=1;i<=5;i++))do echo $idone12345注:i

++ : i=1+1 先赋值再运算 i=1 之后 再 +1

++i : 1+1=i 先运算再赋值 1+1 之后 再=i

或者

例2:打印1-10的奇数[root@server ~]# vim a.sh#!/bin/bashfor ((i=1;i<=10;i+=2)) //i=i+2do echo $idone 附2:类C风格运算符用法

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

+=5 自身变量+5-=5 自身变量-5*=5 自身变量*5/=5 自身变量/5%=5 自身变量%5例3:计算1-100的偶数和[root@server ~]# vim a.sh #!/bin/bashsum=0for ((i=0;i<=100;i+=2))do let sum=$i+$sumdoneecho "1-100的偶数和为:$sum"

案例:

例1、批量添加用户两种方式

1)已后缀批量变化添加

for i in {1..5}

do

useradd stu$i

echo "123" | passwd --stdin stu$i

done

或者 创建6个

2)脚本批量添加用户=====

#!/bin/bash

S=$(cat /home/a.txt)

for i in $S

do

useradd $i

echo "123456" | passwd --stdin $i

done

echo “用户创建完毕”

//批量删除用户的脚本=====

vim udelfor.sh

#!/bin/bash

ULIST=$(cat /root/users.txt)

for UNAME in $ULIST

do

userdel -r $UNAME &>/dev/null

done

例2、根据 IP 地址列表检查主机状态

-c 发送包的数量;-i 发送 ping 包间隔;-W 超时时间

1)根据文本查看

2)根据段查看

network="192.168.10"

for addr in {1..254}

do

ping -c 2 -i 0.5 -W 3 $network.$addr &> /dev/null

if [ $? -eq 0 ];then

echo "$network.$addr is up"

else

echo "$network.$addr is down"

fi

Done

例3 用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警

#!/bin/bash

M=123456

for ((i=1;i<=3;i++))

do

read -p "请输入密码:" S

if [ $S == $M ];then

echo "密码正确"

exit

else

echo "已输入$i次,密码错误,请重新输入"

fi

done

echo "输入超过三次,密码已锁定"

例4 #幸运会员

#!/bin/bash

a=0

b=0

c=0

for ((i=1;i<=10;i++))

do

num=$(expr $[RANDOM%3+1])

LIST=$(cat /opt/name.txt|grep "$num"|awk -F: '{print $2}')

case $LIST in

zhangsan)

let  a++

;;

lisi)

let  b++

;;

*)

let  c++

esac

echo "$LIST"

done

echo "zhangsan:$a次、lisi:$b次、wangwu:$c次"

二  while 循环

1、语法结

2、死循环

(1)语法结构(3种)

while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环

1、语法结构

while表达式

do

command

done

例1:打印1-5

[root@server ~]# vim while.sh

#!/bin/bash

i=1

while [ $i -le 5 ]

do

echo $i

let i++             //注意这里如果不改变$i的值,会变成死循环#

i=$[$i+1]//两种写法

done

例2:输出1-100之间不能被3整除的数字

例3:打印1-100的和

例4:监控某服务( while死循环

while [ 1 -eq 1 ]

//写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去

do

command

done

while true  //条件为真一直运行

do

command

done

while :

do

command

done

例1:猜数字,猜不对就一直猜

#!/bin/bash

N=100

while true

do

read -p "请输入一个数字:" S

if [ $S -eq $N ];then

echo "恭喜你猜对了"

exit

elif [ $S -lt $N ];then

echo "你猜小了"

elif [ $S -gt $N ];then

echo "你猜大了"

fi

done

例21.批量添加规律编号的用户#!/bin/bashUSERS="stu"i=1while [ $i -le 20 ] douseradd ${USERS}$iecho "123456" | passwd --stdin ${USERS}$i &> /dev/null let i++done例3猜商品价格游戏$random用于生成0—32767的随机数第一种方法#!/bin/bashPRICE=$(expr $RANDOM % 1000)a=0echo "商品实际价格范围为 0-999,猜猜看是多少?" while truedoread -p "请输入你猜测的价格数目:" n let a++if [ $n -eq $PRICE ] ; thenecho "恭喜你答对了,实际价格是 $PRICE" echo "你总共猜测了 $a 次"exit 0elif [ $n -gt $PRICE ] ; then echo "你猜高了!"elseecho "你猜低了!"fi done第二种方法#!/bin/bashsorce=$[$RANDOM % 1000]a=1num=0while[ $a -lt 2 ]doread -p "请输入你猜的价格(1-999之 间) :" priceif [ $price -eq $sorce ] ; thenecho "恭喜你猜对了!"let num++let a++elif [ $price -gt $sorce ] ; thenecho "你猜高了!"let num++elif[ $price -lt $sorce ] ; thenecho "你猜小了!"let num++fidoneecho "你一共猜了$num次!"例4 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M 时,发送报警邮件给 root 管理员#!/bin/bash#提取根分区剩余空间disk_size=$(df / |awk '/\//{print $4}')#提取内存剩余空间mem_size=$(free |awk '/Mem/{print $4}') while :do#注意内存和磁盘提取的空间大小都是以Kb 为单位if [ $disk_size ‐le 512000 -a $mem_size ‐le 1024000 ];then mail ‐s Warning root < /dev/null ;; 2) echo "鞋子购买成功" expr $[sum+=150] &> /dev/null ;; 3) echo "手套购买成功" expr $[sum+=40] &> /dev/null ;; *) echo "裤子购买成功" expr $[sum+=155] &> /dev/null esac read -p "是否继续进行购买(yes/no)" doing done let i++ if [ $doing = "no" ] then continue fidone echo "购物总价:$sum"====3.until循环====跟while相反,条件为假进入循环,条件为真退出循环语法结构until 表达式do commanddone例1:计算1-50的和1275两种写法第一种======#!/bin/bashi=0;s=0until [ $i -eq 51 ] dolet s+=i #s+=i,等价于s=s+i,使用加赋值let i+ doneecho $s第二种vim 50.sh#!/bin/bashi=1sum=0until [ $i -eq 51 ] //这里注意如果是50的话条件为真循环结束它计算的是1-49的和,until [ $i -gt 50 ]也行 do sum=$[$i+$sum] let i++ doneecho "$sum"死循环结构until falsedo commanddoneuntil [ 1 -ne 1 ]do commanddone案例2、登录zhangsan用户 使用root 发消息个zhangsan ================#!/bin/bashusername=$1#判断信息格式if [ $# -lt 1 ];then echo "Usage:​​basename $0​​ []" exit 1fi#判断用户是否存在if grep "^$username:" /etc/passwd >/dev/null ;then : else echo "用户不存在" exit 1fi#用户是否在线,如果不在线每5秒联系一次until who|grep "$username" >/dev/nulldo echo "用户不存在" sleep 5donemes=$s=$* echo $mes | write $username注:测试时切换下用户===4、循环控制语句====for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循环的情况,控制循环的命令有以下3个1、continue继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环例1:打印1-5的数字,3不打印[root@server ~]# vim for4.sh#!/bin/bashfor ((i=1;i<=5;i++))do if [ $i -eq 3 ];then continue else echo $i fidone结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了2、break打断,马上停止本次循环,执行循环体外的代码例2:1-10的数字,7后面的都不打印[root@server ~]# vim for4.sh#!/bin/bashfor ((i=1;i<=10;i++))do if [ $i -eq 8 ];then break else echo $i fidone3、exit直接跳出程序,后面可跟状态返回码如exit 1等等for i in {1..5}doif [ $i -eq 3 ];then exit 100 else echo $ifidoneecho hi直接跳出程序所以不会执行最后的echo hi,并且返回码是100通过$?查看

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于Xilinx公司硬IP核的方法实现PCI Express总线接口及数据的传输设计
下一篇:关于springboot响应式编程整合webFlux的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~