shell 循环之 for ,while ,until 语句
shell 循环语句
目录
一:for 循环
1.1. for 循环语句格式
1.1.最简循环:
复制for ((i=1;i<=10;i++)); # 变量i赋值1,判断变量i是否小于等于10,如果成立,则i值+1‘,等同((i=1;i<=10;i=$[i+1]))。 i=1 是初始化一个变量,i<=10 是循环条件,i++是循环条件变更步长,每次加1。
do
echo $i #打印变量i 的值
done
复制for ((i=1;i<=10;i=$[i+2]));
do
echo $i
done
1.1.2一般循环:
复制for 变量名 in 取值列表
do
命令序列
done
取值列表 | 释义 |
---|---|
for i in "值1" “值2” | 变量i 依次取值 "值1",“值2” |
for i in /root/* | 变量i 依次取值 /root/ 下的文件/目录名 |
for i in /etc/*.conf | 变量i 依次取值 /etc/ 下,以 .conf 结尾的文件/目录 |
for i in $(seq 10 -1 1) | 变量i 依次取值,从10 到1 ,步长是 -1 |
for i in | 变量i 依次取值,从1 到10 |
for i in $(ls /root/) | 变量i 依次取值,为 ls /root/ 命令的执行结果 |
for i in $(< /etc/passwd ) | 变量i 依次取值, /etc/passwd 的文件每一行内容 |
for i in $1 $2 $@ | 变量i 依次取值,参数1,参数2 ,及所有参数个数 |
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in "zhangsan" "lisi" # 变量i 在"zhangsan“和 "lisi" 中取值
do
echo $i
done
~
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in /opt/* # 变量 $i 取值 /opt 目录下的文件和子目录(得到的是绝对路径)
do
echo $i
done
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in /opt/*.sh #/opt/*.sh ,变量 $i 取值目录/opt/下,以 .sh 结尾的
do
echo $i
done
~
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in $(seq 5 -1 1) #从5到1,每次变化步长是 -1 。变量 $i 取值从 5 到 1
do
echo $i
done
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in {1..5} #{1..5},从1到5的连续整数, 变量 $i 取值1 到 5
do
echo $i
done
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in $(ls /opt/) # 命令ls /opt/ 执行的结果作为变量 $i 的值(获得的是/opt/目录下的数据的相对路径)
do
echo $i
done
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in $(<userlist) # "<",为重定向输入,变量 $i 取值是 文件userlist的内容。
do
echo $i
done
复制[root@host103 opt]# vim abc.sh
#!/bin/bash
for i in $1 $2 $@ #变量 $i 取值 位置变量1 ,位置变量2 及 当前所有的位置变量
do
echo $i
done
1.2 for 循环练习
1.2.1 使用for 循环产生3个随机数
复制[root@host103 opt]# vim myfor.sh
#!/bin/bash
for i in {1..3}
do
echo $RANDOM
done
1.2.2 使用for 循环检测网络中存活的主机ip(最好使用脚本路径的执行方式,使用source 会有后台命令完成的提示信息)
复制[root@host103 opt]# vim myforping.sh
#!/bin/bash
for ip in {1..255}
do
{
ping -c 3 -i 0.5 -w 2 192.168.23.$ip &> /dev/null # ping 命令 -c:ping次数 ; -i 每次发
送ping 包间隔时间 ; -w ping 开始后多少秒结束
if [ $? -eq 0 ];then #ping 命令的返回值。通了,返回0,不通
返回非零
echo "$ip is up" >> /root/ping.txt
else
echo "$ip is down " >> /root/ping.txt
fi
}& #将 整个 ping 和 判断 放入后台并行执行,效率更高
done
wait
cat /root/ping.txt
rm -rf /root/ping.txt
复制[root@host103 opt]# chmod + x myforping.sh
[root@host103 opt]# ./myforping.sh
1.2.3 使用for 循环批量添加用户并设置密码
复制[root@host103 test]# echo "zhangsan
> lisi
> wangwu" > /test/userlist #保存用户名的文件
[root@host103 test]# vim UserAdd.sh
#!/bin/bash
for Name in $(</test/userlist) #for 循环 从用户名文件中读取数据
do
id $Name &> /dev/null #查看用户是否存在。存在,返回值为0,不存在,返回值为非零
Status=$?
if [ $Status -eq 0 ];then
echo "$Name" is exist
else
useradd -m -p "123456" $Name #用户不存在,则创建用户,并设置密码是"123456"
echo "$Name created"
fi
done
二 :while 循环
重复性测试某个条件,只要条件成立,则反复执行
2.1 while循环格式
复制while 条件测试
do
命令序列
done
2.2 while 循环练习
使用 while 循环完成猜数小游戏
复制#!/bin/bash
NUM=$[RANDOM%1000] #取 0-999 的随机数
usernum=-1
a=0
while [ $usernum -ne $NUM ] #一直猜数,直到猜对
do
echo "Enter q or Q to exit"
read -p "input your number: " usernum
let a++ #每次猜数,变量 a 值加1
if [[ $usernum == "q" || $usernum == "Q" ]];then # 当输入 q 或者 Q 则退出游戏
echo "您退出了游戏"
return
elif [ $usernum -gt $NUM ];then
echo "your number is bigger " #如果用户猜大了,则给出提示信息
echo "" #输出空行,显得更加好看
else
echo "your number is smaller" #用户猜小了,也给出提示信息
echo ""
fi
done
echo "you win "
echo "The num is $NUM" #告诉用户 数字是多少
echo "你一共猜了$a次" #告诉用户一共猜了几次
~
三:until 循环
until 语句,重复测试某个条件,只要条件不成立则反复执行
3.1 until 语句格式
复制until 条件测试操作
do
命令序列
done
3.2 until 练习
使用 until 计算 1-50 的和值
复制#!/bin/bash
a=1 #设置 变量a的 初始值为1
sum=0 #sum 用来接计算的和值
until [ $a -gt 50 ] #until 条件不成立时循环。 当a 值 大于50 时,退出循环。
do
sum=$[$sum + $a ] #每次循环,变量sum的值 都为原 sum 值加上变量a的值 .最后的值,即为1到50 的和值
let a++ #每次循环,变量 a 的值+1
done
echo "从1 到 50 的和值是 $sum" #打印 1-50 的和值
~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现