Shell下的for循环、while循环、until循环使用方法
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章给大家分享的是Shell编程中的for循环、while循环、until循环等语句的语法格式和使用方法,内容比较基础详细,有需要的朋友可以参考下。一、for循环语句1. for循环语法结构1)列
千家信息网最后更新 2025年12月03日Shell下的for循环、while循环、until循环使用方法
这篇文章给大家分享的是Shell编程中的for循环、while循环、until循环等语句的语法格式和使用方法,内容比较基础详细,有需要的朋友可以参考下。
一、for循环语句
1. for循环语法结构
1)列表==循环
列表for循环:用于将一组命令执行已知的次数
- 基本语法格式
for variable in {list} do command command … done或者for variable in a b c do command command done- 举例说明
# for var in {1..10};do echo $var;done# for var in 1 2 3 4 5;do echo $var;done# for var in `seq 10`;do echo $var;done# for var in $(seq 10);do echo $var;done# for var in {0..10..2};do echo $var;done# for var in {2..10..2};do echo $var;done# for var in {10..1};do echo $var;done# for var in {10..1..-2};do echo $var;done# for var in `seq 10 -2 1`;do echo $var;done2)不带列表循环
不带列表的for循环执行时由用户指定参数和参数的个数
- 基本语法格式
for variable do command command … done- 举例说明
#!/bin/bashfor vardoecho $vardoneecho "脚本后面有$#个参数"3)类C风格的for循环
- 基本语法结构
for(( expr1;expr2;expr3 )) do command command … donefor (( i=1;i<=5;i++)) do echo $i doneexpr1:定义变量并赋初值expr2:决定是否进行循环(条件)expr3:决定循环变量如何改变,决定循环什么时候退出- 举例说明
# for ((i=1;i<=5;i++));do echo $i;done # for ((i=1;i<=10;i+=2));do echo $i;done # for ((i=2;i<=10;i+=2));do echo $i;done2. 应用案例
1)脚本==计算==1-100奇数和
① 思路
- 定义一个变量来保存奇数的和 ==sum===0
- 找出1-100的奇数,保存到另一个变量里 ==i===遍历出来的奇数
- 从1-100中找出奇数后,再相加,然后将和赋值给变量 循环变量 for
- 遍历完毕后,将sum的值打印出来
② 落地实现(条条大路通罗马)
#!/bin/env bash# 计算1-100的奇数和# 定义变量来保存奇数和sum=0#for循环遍历1-100的奇数,并且相加,把结果重新赋值给sumfor i in {1..100..2}do let sum=$sum+$idone#打印所有奇数的和echo "1-100的奇数和是:$sum"方法1:#!/bin/bashsum=0for i in {1..100..2}do sum=$[$i+$sum]doneecho "1-100的奇数和为:$sum"方法2:#!/bin/bashsum=0for ((i=1;i<=100;i+=2))do let sum=$i+$sumdoneecho "1-100的奇数和为:$sum"方法3:#!/bin/bashsum=0for ((i=1;i<=100;i++))do if [ $[$i%2] -ne 0 ];then let sum=$sum+$i fi或者test $[$i%2] -ne 0 && let sum=$sum+$idoneecho "1-100的奇数和为:$sum"方法4:sum=0for ((i=1;i<=100;i++))do if [ $[$i%2] -eq 0 ];then continue else let sum=$sum+$i fidoneecho "1-100的奇数和为:$sum"#!/bin/bashsum=0for ((i=1;i<=100;i++))do test $[$i%2] -eq 0 && continue || let sum=sum+$idoneecho "1-100的奇数和是:$sum"③ 循环控制语句
循环体: ==do....done==之间的内容
- continue:继续;表示==循环体==内下面的代码不执行,重新开始下一次循环
- break:打断;马上停止执行本次循环,执行==循环体==后面的代码
- exit:表示直接跳出程序
[root@server ~]# cat for5.sh #!/bin/bashfor i in {1..5}do test $i -eq 2 && break || touch /tmp/file$idoneecho hello hahahah2)判断所输整数是否为质数
质数(素数):只能被1和它本身整除的数叫质数。
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
① 思路
- 让用户输入一个数,保存到一个变量里
- 如果能被其他数整除就不是质数-->
$num%$i是否等于0$i=2到$num-1 - 如果输入的数是1或者2取模根据上面判断又不符合,所以先排除1和2
- 测试序列从2开始,输入的数是4-->得出结果
$num不能和$i相等,并且$num不能小于$i
② 落地实现
#!/bin/bashread -p "请输入一个正整数字:" number[ $number -eq 1 ] && echo "$number不是质数" && exit[ $number -eq 2 ] && echo "$number是质数" && exitfor i in `seq 2 $[$number-1]` do [ $[$number%$i] -eq 0 ] && echo "$number不是质数" && exit doneecho "$number是质数" && exit3)批量创建用户
需求:批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123
① 思路
- 添加用户的命令
- 判断class组是否存在
- 根据题意,判断该脚本循环5次来添加用户
- 给用户设置密码,应该放到循环体里面
② 落地实现
方法一:#!/bin/bash#判断class组是否存在grep -w class /etc/group &>/dev/null[ $? -ne 0 ] && groupadd class#批量创建5个用户for i in {1..5}do useradd -G class u$i echo 123|passwd --stdin u$idone方法二:#!/bin/bash#判断class组是否存在cut -d: -f1 /etc/group|grep -w class &>/dev/null[ $? -ne 0 ] && groupadd class#循环增加用户,循环次数5次,for循环,给用户设定密码for ((i=1;i<=5;i++))do useradd u$i -G class echo 123|passwd --stdin u$idone方法三:#!/bin/bashgrep -w class /etc/group &>/dev/nulltest $? -ne 0 && groupadd class或者groupadd class &>/dev/nullfor ((i=1;i<=5;i++))douseradd -G class u$i && echo 123|passwd --stdin u$idone4)批量创建用户
需求1:批量新建5个用户stu1~stu5,要求这几个用户的家目录都在/rhome.
#!/bin/bash#判断/rhome是否存在[ -f /rhome ] && mv /rhome /rhome.baktest ! -f /rhome -a ! -d /rhome && mkdir /rhome或者[ -f /rhome ] && mv /rhome /rhome.bak || [ ! -d /rhome ] && mkdir /rhome #创建用户,循环5次for ((i=1;i<=5;i++))do useradd -d /rhome/stu$i stu$i echo 123|passwd --stdin stu$idone5)局域网内脚本检查主机网络通讯
需求2:
写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
以10.1.1.1~10.1.1.10为例
#!/bin/bash#定义变量ip=10.1.1#循环去ping主机的IPfor ((i=1;i<=10;i++))do ping -c1 $ip.$i &>/dev/null if [ $? -eq 0 ];then echo "$ip.$i is ok" >> /tmp/ip_up.txt else echo "$ip.$i is down" >> /tmp/ip_down.txt fi 或者 [ $? -eq 0 ] && echo "$ip.$i is ok" >> /tmp/ip_up.txt || echo "$ip.$i is down" >> /tmp/ip_down.txtdone[root@server shell03]# time ./ping.sh real 0m24.129suser 0m0.006ssys 0m0.005s延伸扩展:shell脚本并发
并行执行:{程序}&表示将程序放到后台并行执行,如果需要等待程序执行完毕再进行下面内容,需要加wait#!/bin/bash#定义变量ip=10.1.1#循环去ping主机的IPfor ((i=1;i<=10;i++))do{ ping -c1 $ip.$i &>/dev/null if [ $? -eq 0 ];then echo "$ip.$i is ok" >> /tmp/ip_up.txt else echo "$ip.$i is down" >> /tmp/ip_down.txt fi}&donewaitecho "ip is ok...."[root@server ~]# time ./ping.sh ip is ok...real 0m3.091suser 0m0.001ssys 0m0.008s6)判断闰年
需求3:
输入一个年份,判断是否是润年(能被4整除但不能被100整除,或能被400整除的年份即为闰年)
#!/bin/bashread -p "Please input year:(2017)" yearif [ $[$year%4] -eq 0 -a $[$year0] -ne 0 ];then echo "$year is leap year"elif [ $[$year%400] -eq 0 ];then echo "$year is leap year"else echo "$year is not leap year"fi##4. 总结
- FOR循环语法结构
- FOR循环可以结合条件判断和流程控制语句
- do ......done 循环体
- 循环体里可以是命令集合,再加上条件判断以及流程控制
- 控制循环语句
- continue 继续,跳过本次循环,继续下一次循环
- break 打断,跳出循环,执行循环体外的代码
- exit 退出,直接退出程序
二、while循环语句
特点:==条件为真就进入循环;条件为假就退出循环==
1. while循环语法结构
while 表达式 do command... donewhile [ 1 -eq 1 ] 或者 (( 1 > 2 )) do command command ... done循环打印1-5数字
FOR循环打印:for ((i=1;i<=5;i++))do echo $idonewhile循环打印:i=1while [ $i -le 5 ]do echo $i let i++done2. 应用案例
1)脚本计算1-50偶数和
#!/bin/bash#定义变量sum=0i=2#循环打印1-50的偶数和并且计算后重新赋值给sumwhile [ $i -le 50 ]do let sum=sum+i let i+=2done#打印sum的值echo "1-50的偶数和为:$sum"2)脚本同步系统时间
① 具体需求
- 写一个脚本,30秒同步一次系统时间,时间同步服务器10.1.1.1
- 如果同步失败,则进行邮件报警,每次失败都报警
- 同步成功,也进行邮件通知,但是成功100次才通知一次
② 思路
每个30s同步一次时间,该脚本是一个死循环
同步失败发送邮件
- 同步成功100次发送邮件
③ 落地实现
#!/bin/bash#定义变量count=0ntp_server=10.1.1.1while truedo rdate -s $ntp-server &>/dev/null if [ $? -ne 0 ];then echo "system date failed" |mail -s 'check system date' root@localhost else let count++ if [ $[$count0] -eq 0 ];then echo "system date successfull" |mail -s 'check system date' root@localhost && count=0 fi fisleep 3done以上脚本还有更多的写法,课后自己完成三、until循环
特点:==条件为假就进入循环;条件为真就退出循环==
1. until语法结构
until expression [ 1 -eq 1 ] (( 1 >= 1 )) do command command ... done打印1-5数字
i=1while [ $i -le 5 ]do echo $i let i++donei=1until [ $i -gt 5 ]do echo $i let i++done2. 应用案例
1)具体需求
- 使用until语句批量创建10个用户,要求stu1-stu5用户的UID分别为1001-1005;
- stu6~stu10用户的家目录分别在/rhome/stu6-/rhome/stu10
2)思路
- 创建用户语句
useradd -u|useradd -d - 使用循环语句(until)批量创建用户
until循环语句结构 - 判断用户前5个和后5个
条件判断语句
3)落地实现
#!/bin/env bashif [ -d /rhome ];then echo "/rhome目录已存在"else mkdir /rhome echo "/rhome不存在,已完成创建"fii=1until [ $i -gt 10 ]do if [ $i -le 5 ];then useradd -u $[1000+$i] stu$i echo 123|passwd --stdin stu$i else useradd -d /rhome/stu$i stu$i echo 123|passwd --stdin stu$i filet i++done==================================================#!/bin/bashi=1until [ $i -gt 10 ]do if [ $i -le 5 ];then useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i else [ ! -d /rhome ] && mkdir /rhome useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i filet i++done以上就是在Shell编程下的for循环、while循环、until循环等语句的语法格式和使用方法,希望你看完这篇文章能学会这些循环的使用方法,如果想了解更多内容,请关注资讯频道。
循环
用户
奇数
变量
语句
脚本
方法
语法
条件
质数
同步
循环体
结构
需求
思路
程序
落地
输入
内容
时间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全防护打不开怎么办
狭义的网络安全吗
台湾香港有哪些数据库
挖矿借别人的服务器中转
uber数据库现状
分析地图poi数据库
网络安全工程师怎么考证
电脑远程服务器怎么重启
dna数据库信息收集
网络技术公司广告语大全
禁止连续输入7个数据库
软件开发接近完成时应该执行
石家庄专业软件开发多少钱
常见的网络安全威胁动画
数据库系统概率优化题
网络安全功防技术实战电子书
sql数据库企业版安装
易语言合并数据库
文献数据库研究
赛季服各服务器人口分析
易娱云方舟服务器管理
航云天软件开发公司
用友变动单数据库
网络安全工程师怎么考证
服务器怎么用输入法
虚拟机搭建服务器只能自己访问吗
数据库前沿技术 ppt
通过云服务器架设大话
仓库数据库怎么改变
半导体行业属于互联网高科技类吗