shell脚本之while循环和until循环
1、while循环
循环执行是以满足条件为前提,条件不满足,循环终止。
用于不知道循环次数,直到条件不满足为止。
while [判断条件]
do
代码
done
例1:打印1-5的数字
i=1 #在循环体外定义一个初始值
while [ i -le 5 ]
do
echo $i
let i++ #让变量发生变化,以达到条件不满足的情况,终止循环
done
例2:用while的方式实现1-100的奇数和以及偶数和
#!/bin/bash
i=0
sum1=0
sum2=0
while [ $i -le 100 ]
do
if [ $(($i%2)) -eq 0 ]
then
sum1=$(($sum1+$i)) #偶数累加
else
sum2=$(($sum2+$i)) #奇数累加
fi
let i++ #这个一般都放在done上面,以免出现bug
done
echo "偶数和$sum1"
echo "奇数和$sum2"
死循环
三种写法如下:
while true
do
代码
done
----------------------------------
while :do
代码
done
----------------------------------
while [1 -eq 1]do
代码
done
2、until循环
不满足条件才进行循环,一旦条件成立,循环立即终止。
until [判断条件]
do
代码
done
练习
练1:打印出/opt目录下,所有的以.txt为结尾的文件的内容合并到一个文件
#!/bin/bash
for file in /opt/*.txt
do
paste "$file" >> /opt/1.txt
done
练2:用户输入密码,脚本来判断密码是否正确,正确的是123456,输入正确提示用户,连续输错三次以上提示 。
#!/bin/bash
i=1
psd="123456“
while [ $i -le 3 ] do
read -s -p "请输入密码:" key #-s输入不可见
if [ "$key" == ""$psd" ]
then echo "密码输入正确"
exit
else echo "输入错误"
let i++ fi done
echo"输入三次错误密码,锁定!"
练3:自定义输入一个网段 192.168.206.{1-254} 然后ping整个网段,保留可用的地址到/opt/hosts,#ping不通提示不通即可,同时不显示ping的过程
#!/bin/bash
read -p "请输入192.168.206.网段:" ip
for i in {1..254}
do
{
ping -c 3 ${ip}${i} &> /dev/null
if [ $? -eq 0 ]
then
echo "${ip}${i}" >> /opt/host_ip
echo "${ip}${i}可用"
else
echo "${ip}${i}不可用"
fi
}& #用花括号把整个执行语句作为一个整体,然后&表示并行处理
done
wait #执行结束之后不等待,直接退出
练4:猜数字,用for 或者 while 写一个死循环,随机生成一个数1-100,用户要一直猜数字,直到猜对了才可以退出。
#!/bin/bash
echo "猜数字游戏开始了"
count=0
a=$((RANDOM%100+1))
echo $a > 123.txt
for((;;))
do
read -p "请输入一个数字(1-100):" num
let count++
if [ "$num" -lt "$a" ]
then
echo "数字比你输入的数大,请继续猜"
elif [ "$num" -gt "$a" ]
then
echo "数字比你输入的数小,请继续猜"
else
echo "总共猜了$count次"
echo "恭喜你猜对了,结束游戏"
exit
fi
done
练5:死循环实现整数运算即可:+ - * / %
#! /bin/bash
for((;;))
do
read -p "请输入第一个数字:" num1
read -p "请输入运算符(+ - * / %):" fh
read -p "请输入第二个数字:" num2
if [[ "$fh" == "/" || "$fh" == % ]]
then
if [ $num2 -eq 0 ]
then
echo "输入错误,除数不能为0"
continue
fi
fi
result=`echo $((${num1} ${fh} ${num2}))`
echo "计算的结果是$result"
done