循环
循环是指依赖某一个条件的限制,对一串逻辑性代码,进行反复性的操作,直到能够满足预期结果进行结束循环。如果没有预期结果,不间断执行,我们称之为“死循环” 。与循环有关的三个专业性名词:遍历,迭代,递归
- 遍历(traversal) - 按规则访问非线性结构中的每一项。
- 迭代(iterate) - 按顺序访问线性结构中的每一项。
- 递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况。
循环——for
语法:
for <变量> in <取值列表>
do
命令集
......
done
基本循环
列表打印–打印一份一到十的数字列表
vim for1.sh
#!/bin/bash
for i in {1..10}
do
echo $i
done
chmod +x for1.sh
./for1.sh
累加求和–求从1加到10的和
vim for3.sh
#!/bin/bash
sum=0
for i in {1..10}
do
sum=$[sum+i]
done
echo $sum
chmod +x for3.sh
./for3.sh
文件内容循环
批量添加用户
-
用户名存放在users.txt文件中,每行一个
-
初始密码均设为123456
#编辑users.txt文件
vim users.txt
tangtang
wl
cy
sanshi
tj
yzl
#编辑创建用户的脚本
vim for4.sh
#!/bin/bash
namefile=/root/users.txt
for name in $( cat $namefile )
do
useradd $name
echo 123456 | passwd --stdin $name
done
echo "用户创建完成"
#执行
chmod +x for4.sh
./for4.sh
根据IP地址检查主机状态
-
IP地址存放在ipadds.txt文件中,每行一个
-
使用ping命令检测各主机的连通性
#编辑ipadds.txt文件
vim ipadds.txt
10.190.33.10
10.190.33.20
10.190.33.30
10.190.33.91
10.190.33.92
10.190.33.93
#编辑ping命令的脚本
vim for5.sh
#!/bin/bash
ipfile=/root/ipadds.txt
for ip in $( cat $ipfile )
do
ping -c 4 -i 0.5 -w 2 $ip
if [ $? -eq 0 ]
then
echo "$ip is online"
else
echo "$ip is offline"
fi
done
#执行
chmod +x for5.sh
./for5.sh
运行结果过于冗杂,可以使用“&>”输出到/dev/null文件中
vim for5.sh
#!/bin/bash
ipfile=/root/ipadds.txt
for ip in $( cat $ipfile )
do
ping -c 4 -i 0.5 -w 2 $ip &> /dev/null
if [ $? -eq 0 ]
then
echo "$ip is online"
else
echo "$ip is offline"
fi
done
循环——while
语法:
while <条件测试表达式>
do
命令集
......
done
写个脚本实现 猜测0-999的随机价格,猜不中则一直猜
vim whlie1.sh
#!/bin/bash
PRICE=$[RANDOM % 1000]
a=1
b=0
while [ $a -eq 1 ];
do
read -p "请输入你猜测的价格(0-999):" NUM
let b++
if [ $NUM -eq $PRICE ] && [ $b -le 5 ];then
echo "恭喜!你猜中了!!"
exit 0
elif [ $NUM -gt $PRICE ] && [ $NUM -le 999 ];then
if [ $b -lt 5 ];then
echo "猜大了!!请重猜"
else
echo "真遗憾,猜测次数用完!"
exit 1
fi
elif [ $NUM -le $PRICE ] && [ $NUM -ge 0 ];then
if [ $b -lt 5 ];then
echo "猜小了!!请重猜"
else
echo "真遗憾,猜测次数用完!"
exit 2
fi
else
echo "输入有误!请重新输入!!"
fi
done
chmod +x whlie1.sh
./whlie1.sh
计算从1到任意数(小于100)所有整数的和
vim while2.sh
#!/bin/bash
a=1
sum=0
read -p "请输入一个1到100的整数:" num
if [ $num -ge 1 ] && [ $num -le 100 ];then
while [ $a -le $num ]
do
let sum+=a
let a++
done
echo "1到 $num 总和为$sum"
else
echo "输入有误!"
fi
chmod +x while2.sh
./while2.sh
循环——until
语法:
until <条件测试表达式>
do
命令集
......
done
求1-50的和
vim until1.sh
#!/bin/bash
a=1
sum=0
until [ $a -gt 50 ]
do
let sum+=$a
let a++
done
echo "1-50之间的整数和为: $sum "
chmod +x until1.sh
./until1.sh
退出循环
CONTINUE
语法:
continue n
n 表示循环的层数:
-
如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
-
如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。
BREAK
语法:
break n
n 表示循环的层数:
- n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。break关键字通常和 if 语句一起使用,即满足条件时便跳出循环
EXIT
语法:
exit n
- exit 命令用于退出当前程序,并返回程序执行结果。
- exit 命令可以接受一个整数值作为参数,代表退出状态。如果不指定,退出码由shell中最后一个命令决定。一般情况下,退出状态为 0 表示成功,退出状态为非 0表示执行失败(出错)。
- exit 退出状态只能是一个介于 0~255 之间的整数。
- $?保存exit退出值。