文章目录
一,for循环
1.1 for循环格式
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
会输出1到10
编辑for.sh
那么如何隔两位输出结果呢?
例如13579
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 {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@caoyuzhou ~]# vim for.sh
#!/bin/bash
for i in $(seq 5 -1 1) #从5到1,每次变化步长是 -1 。变量 $i 取值从 5 到 1
do
echo $i
done
[root@caoyuzhou ~](https://www.icode9.com/i/ll/?i=c53bd825354e4d1a93d069b5954cb088.png)
# vim for.sh
#!/bin/bash
for i in {1..5} #{1..5},从1到5的连续整数, 变量 $i 取值1 到 5
do
echo $i
done
[root@caoyuzhou ~]# vim for.sh
#!/bin/bash
for i in $(ls /opt/) # 命令ls /opt/ 执行的结果作为变量 $i 的值(获得的是/opt/目录下的数据的相对路径)
do
echo $i
done
[root@caoyuzhzou ~]# vim for.sh
#!/bin/bash
for i in $(<userlist) # "<",为重定向输入,变量 $i 取值是 文件userlist的内容。
do
echo $i
done
1.2 小练习
使用for循环检测网络中存活的主机ip
[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@caoyuzhou ~]# 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 的和值