for循环

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

for循环语句
一、 for循环

1、语法结构

(1)列表循环
(2)不带列表循环
(3)类c风格的for循环
遍历

for 变量名 in { list}
do
command
done
for i in {a..c}
do
echo $i
done
for i in {1..5}   //{ }里面不识别变量
do
echo $i
done
for i in 'seq 5'        // seq 5=1、2、3、4、5序列
do
echo $i
done
a=10
for i in `seq $a`  //seq可以引用变量
do
echo $i
done
for 变量名 in a b c
do
command
done
for i in a b c  //这里实际没有调用,所以就相当于in后面几个参数就循环几次
do
echo 123
done
for i in a b c   //这里调用到i变量了,所以就正常显示i的值(a\b\c)
do
echo $i
done

案列
例1:打印1-5这5个数字

[root@server ~]# vim for.sh#!/ bin/ bash
for i in {1..5)
do
echo $i
done

例2:打印5次hello world
注意:虽然我们定义了一个变量i,但是没有使用它,它只是控制循环次数

[root@server ~] # vim for.sh#!/bin/bash
for i in {1..5}
do
echo hello world
done

例3:打印abcde

[root@server ~]# vim for.sh #!/bin/bash
for i in a b c d e
do
echo $i
done

例4:输出0-50之间的偶数

[root@server ~]# vim for.sh#!/ bin/ bash
for i in {0..50..2]   //..2代表步长为2,每隔2个
do
echo $i
done

附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 s (seq 0 2 10) 1-10的偶数,中间为步长例子
for i in $ (seq o 2 10) ; do ;echo $i ;done

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

for 变量名
do
command
done

例1:打印hello第一种:

[ root@server ~]# vim for2.sh
#!/bin/ bash
for i
do
echo hello
done
[root&server ~]# ./for2.sh     //没有给脚本传参所以执行了没有结果
[ root@server ~-]# ./for2.sh a     //把a赋值给变量i,i有值了它就开始执行do ..done了hello

第二种:

for i
do
echo $i
done
[root@client ~] # bash for.sh hello
hello

( 3)类c风格的for循环

for ( (expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出

例1:打印1-5迭代

[zoot@serveE~]# vim for3.sh#!/bin/bash
for  ((i=1;i<=5;i++))
do
echo $i
done

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

例2:打印1-10的奇数

[ root@server ~]# vim for3.sh #! /bin/bash
for ( (i=1 ;i<=10;i+=2))  //i=i+2
do
echo $i
done

附2:类c风格运算符用法

++ 自身变量+1
– 自身变量-1
+=5自身变量+5
-=5自身变量-5
=5 自身变量5
/=5自身变量/5
%=5自身变量%5

例3:计算1-100的奇数和

[rooteserver ~]# vim for3.sh#!/bin/bash
sum=0
for ((i=1;i<=100 ;i+=2))
do
let sum=$i+$sum
done
echo "1-100的奇数和为:$sum"

案例:
例1、批量添加用户两种方式
1)以后缀批量变化添加

for i in {1..5}
do
useradd stu$i
echo "123" | passwd --stdin stu$i
done

2)脚本批量添加用户

#!/bin/ bash
ULIST=$ (cat / root/users.txt)
for UNAME in $ULIST
do
useradd  $UNAME
echo "123456" | passwd --stdin $UNAME &>/dev/null
done

//批量删除用户的脚本

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)根据文本查看

#!/bin/bashHLIST=$ (cat /root/ ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> l dev/ null
if [ $? -eq 0 ];then
echo "Host $IP is up."
else
echo "Host $IP is down . "
fi
done

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次则报警

vim test. sh
#!/bin/bash
init=123456
for i in {1. .3 }
do
read -p "请输入密码:" pass
if  [ $pass == $init ] ; then
echo “密码正确"
exit
fi
done
echo“警告:密码错误"

#幸运会员

#!/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)
letb++
;;
*)
let c++
esac
echo "$LIST"
done
echo "zhangsan : $a次、lisi:$b次、dangwu : $c次"

while循环

1、语法结构
2、死循环
(1)语法结构(3种)

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

1、语法结构

while 表达式
docommand
done

例1:打印1-5

[root@server ~]# vim while.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
doecho $ilet i++   //注意这里如果不改变$i的值,会变成死循环
#i=$[$i+1]  //两种写法
done
echo "最后i的值为: $i"

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

[root@server myscripts]# vim 3.sh
#!/bin/bash
i=1
while [ $i -le 100 ]doif [[ $i%3 -ne 0 ]]then echo "$i"filet i++
done

例3:打印1-100的和

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
dolet sum=$i+$sumlet i++
done
echo $sum

例4:监控某服务(httpd)运行状态

while ps aux | grep httpd | grep -v grep &> /dev/null
do
echo "httpd 正在运行中"
sleep 2
done
echo "httpd 不在运行"

while死循环

while [ 1 -eq 1 ]  //写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
docommand
done
while true
docommand
done
while :
docommand
done

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

num=10
while true
do
read -p "请输入数字:" shu
if [ $shu -eq $num ];thenecho "你猜对了"break
elif [ $shu -gt $num ];thenecho "你猜大了"
elif [ $shu -lt $num ];thenecho "你猜小了"
fi
done

例2
1.批量添加规律编号的用户========

#!/bin/bash
USERS="stu"
i=1
while [ $i -le 20 ]
do
useradd ${USERS}$i
echo "123456" | passwd --stdin ${USERS}$i &> /dev/null
let i++
done

例3
猜商品价格游戏
$random用于生成0—32767的随机数

第一种方法

#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
a=0
echo "商品实际价格范围为 0-999,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" n
let a++
if [ $n -eq $PRICE ] ; then
echo "恭喜你答对了,实际价格是 $PRICE"
echo "你总共猜测了 $a 次"
exit 0
elif [ $n -gt $PRICE ] ; thenecho "你猜高了!"
else
echo "你猜低了!"
fi
done

第二种方法

#!/bin/bash
sorce=$[$RANDOM % 1000]
a=1
num=0
while[ $a -lt 2 ]
do
read -p "请输入你猜的价格(1-999之 间) :"  price
if [ $price -eq $sorce ] ; then
echo "恭喜你猜对了!"
let num++
let a++
elif [ $price -gt $sorce ] ; then
echo "你猜高了!"
let num++
elif[ $price -lt $sorce ] ; then
echo "你猜小了!"
let num++
fi
done
echo "你一共猜了$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 <<EOF
Insufficient resources,资源不足EOF
fi
done

例5 定义网卡流量

#!/bin/bash
#定义流量单位
DW=kb/s
while :
do#定义某一时间点的提取网卡流量数值,我这里的网卡是ens33OLD_IN=$(cat /proc/net/dev | awk '$1~/ens33/{print $2}')OLD_OUT=`cat /proc/net/dev | awk '$1~/ens33/{print $10}'`sleep 5#定义下一个时间点的提取网卡流量数值。
NEW_IN=$(cat /proc/net/dev | awk '$1~/ens33/{print $2}')
NEW_OUT=`cat /proc/net/dev | awk '$1~/ens33/{print $10}'`#进行流量的计算,默认是Bytes,转换成kb/s
IN=$[$[$NEW_IN - $OLD_IN]/1024]$DW
OUT=$[$[$NEW_OUT - $OLD_OUT]/1024]$DW
sleep 5#打印对应的值
echo -e "接收数据:${IN}\t发送数据:$OUT"
#!/bin/bash
i=1
sum=0
while [ $i -le 5 ]
doecho "进入第$i家商店"read -p "是否进入看看(yes/no)" doingwhile [ $doing = "yes" ]doecho "1:衣服¥200"echo "2:鞋子¥150"echo "3:手套¥40"echo "4:裤子¥155"read -p "请选择需要购买的商品序列:" numcase $num in1)echo "衣服购买成功"expr $[sum+=200] &> /dev/null;;2)echo "鞋子购买成功"expr $[sum+=150] &> /dev/null;;3)echo "手套购买成功"expr $[sum+=40] &> /dev/null;;*)echo "裤子购买成功"expr $[sum+=155] &> /dev/nullesacread -p "是否继续进行购买(yes/no)" doingdonelet i++if [ $doing = "no" ]thencontinuefi
doneecho "购物总价:$sum"

until循环

跟while相反,条件为假进入循环,条件为真退出循环
语法结构

until 表达式
docommand
done

例1:计算1-50的和1275两种写法

第一种

#!/bin/bash
i=0;s=0
until [ $i -eq 51 ]
do
let s+=i    #s+=i,等价于s=s+i,使用加赋值
let i++
done
echo $s

第二种

vim 50.sh
#!/bin/bash
i=1
sum=0
until [ $i -eq 51 ]   //这里注意如果是50的话条件为真循环结束它计算的是1-49的和,until [ $i -gt 50 ]也行dosum=$[$i+$sum]let i++done
echo "$sum"

死循环结构

until false
docommand
doneuntil [ 1 -ne 1 ]
docommand
done

案例2、登录zhangsan用户 使用root 发消息个zhangsan ================

#!/bin/bash
username=$1
#判断信息格式
if [ $# -lt 1 ];thenecho "Usage:`basename $0` <username> [<message>]" exit 1
fi
#判断用户是否存在
if grep "^$username:" /etc/passwd >/dev/null ;then :
elseecho "用户不存在"exit 1
fi
#用户是否在线,如果不在线每5秒联系一次
until who|grep "$username" >/dev/null
doecho "用户不存在"sleep 5
done
mes=$*
echo $mes | write $username
注:测试时切换下用户

循环控制语句

for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循环的情况,控制循环的命令有以下3个

1、continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环

例1:打印1-5的数字,3不打印

[root@server ~]# vim for4.sh#!/bin/bash
for ((i=1;i<=5;i++))
doif [ $i -eq 3 ];thencontinueelseecho $ifi
done

结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了

2、break
打断,马上停止本次循环,执行循环体外的代码

例2:1-10的数字,7后面的都不打印

[root@server ~]# vim for4.sh#!/bin/bash
for ((i=1;i<=10;i++))
doif [ $i -eq 8 ];thenbreakelseecho $ifi
done

3、exit
直接跳出程序,后面可跟状态返回码如exit 1等等

for i in {1..5}
do
if [ $i -eq 3 ];thenexit  100
elseecho $i
fidone
echo hi

直接跳出程序所以不会执行最后的echo hi,并且返回码是100通过$?查看

总结

编写shell脚本步骤:
1.确定需求
2.知晓命令
3.定义变量
4.完善语法结构

for、while、until循环相关推荐

  1. 中兴面试总结,华为。技术,市场

    1,软件测试,如何把这个测试做的更好. 进到一个新项目,作为测试人员应该都是想把测试做好,项目在符合客户质量要求的情况下按时交付的吧.但往往都事与愿违,造成这个结果的原因有很多很多.通过这段时间做自动 ...

  2. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符

    1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...

  3. 【机器学习】RNN循环神经网络

    循环神经网络归属: 领域:机器学习 方向:自然语言处理 贡献:自动文本生成 循环神经网络实际应用: 生活中因为原始数据都是序列化的,比如自然语言,语音处理,时间序列问题(股票价格)等问题, 这个时候需 ...

  4. MindSpore循环神经网络

    MindSpore循环神经网络 一. 神经网络的组成 神经元模型:首先简单的了解以下构成神经网络的最基础单元:神经元.每个神经元与其它神经元相连,处于激活状态时,就会向相连的神经元发送相应信号.从而改 ...

  5. 循环IRNNv2Layer实现

    循环IRNNv2Layer实现 IRNNv2Layer实现循环层,例如循环神经网络(RNN),门控循环单元(GRU)和长期短期记忆(LSTM).支持的类型为RNN,GRU和LSTM.它执行循环操作,该 ...

  6. CodeGen按钮循环

    CodeGen按钮循环 按钮循环是一个模板文件构造,它允许您迭代CodeGen拥有的按钮信息集合. 在按钮循环中处理的按钮的定义可以来自两个位置之一. 如果基于UI工具箱输入窗口定义进行处理,则默认情 ...

  7. CodeGen标记循环

    CodeGen标记循环 标记循环是一个模板文件构造,它允许您迭代CodeGen拥有的标记信息的集合.为了使用标记循环,必须基于至少定义了一个字段标记的存储库结构生成代码. 标记循环由一对匹配的< ...

  8. CodeGen结构循环回路

    CodeGen结构循环回路 structure循环是一个模板文件构造,它允许您迭代CodeGen拥有的有关结构的集合.为了使用结构循环,必须同时基于多个存储库结构生成代码. CodeGen可以通过以下 ...

  9. CodeGen融合核心关系循环扩展

    CodeGen融合核心关系循环扩展 Expansion Tokens <HARMONYCORE_RELATION_NAME> 插入当前关系的名称.关系名称将自动生成,但可以由Harmony ...

  10. CodeGen字段循环Field Loop

    CodeGen字段循环Field Loop 字段循环是一个模板文件构造,它允许迭代CodeGen拥有的有关字段的集合.这些字段定义可以来自以下两个位置之一: •如果基于从存储库结构中获取的信息生成代码 ...

最新文章

  1. 笔记-信息系统开发基础-信息系统规划方法-大型新信息系统特征/企业系统规划步骤...
  2. oracle对substr去重,oracle使用笔记
  3. Java面试知识点总结宝典助你通关!成功入职字节跳动
  4. JAVA入门级教学之(编写第一个HelloWorld程序)
  5. 风控人需知:信贷风险流程中的决策矩阵与实操
  6. ubuntu18安装vnpyv1.9.2之二
  7. 弱网环境搭建方案选型
  8. stm32c8t6之跑马灯程序配置
  9. 方法重写与方法重载的区别
  10. Science | 郑文山等发布微生物组单细胞测序新技术Microbe-seq(王军/戴磊/晁彦杰点评)...
  11. 双目摄像头相关参数介绍
  12. 微信绑定银行卡消息服务器,微信绑定了银行卡,如果不注意这个消息,可能会出现自动扣费...
  13. distinct 和order by 冲突解决方案
  14. 2022-07-28 顾宇佳 学习笔记
  15. android AMS学习(一)
  16. Mysql主从复制之异步与半同步以及主从切换(实验)
  17. android sdl 插件,在Eclipse中配置SDL2.0 for Android
  18. 基于matlab的立体图像编码解码算法仿真与分析
  19. Mac Cornerstone详细使用说明,图文教程
  20. 计算机视觉方面的三大国际会议及期刊会议影响因子

热门文章

  1. 影响神经网络训练速度的因素使得神经网络训练速度加快的方法
  2. zf框架的思想及学习总结
  3. js获取年月日星期日期
  4. TCP/IP RFC如何查询
  5. linux 打开和关闭防火墙命令
  6. 2B SaaS的黏性在哪里?
  7. SimpleDateFormat类 格式化日期
  8. js合并两个数组的三种方法
  9. partprobe 和 partx 的用法
  10. Vue cli 引入第三方JS和CSS的常用方法