第7章 Shell流程控制之while循环
第7章 shell流程控制之while循环
1.while循环使用场景
1.for是明确知道要循环多少次,while可以在不知道要循环多少次的场景下使用
2.比如如果用户输入错了,可以尝试重新输入,而不是退出
3.比如除非用户输入了退出指令才退出,否则一直不退出
2.while循环基本语法
while 条件测试 #如果条件成立,则执行循环
do
循环执行的命令
done
3.举例
直到满足条件退出
#!/bin/bash
num=0
while [ ${num} -lt 10 ]
do
echo "num is ${num}"
num=$[ ${num} + 1 ]
done
从文件里读取数据
方法1:
exec < test.txt
while read line
do
echo $line
done
方法2:
while read line
do
echo $line
done < test.txt
方法3:
cat test.txt|while read line
do
echo $line
done
4.练习
计算器
需求:使用while输出如下格式
9*1 =9
8*2 =16
7*3 =21
6*4 =24
5*5 =25
4*6 =24
3*7 =21
2*8 =16
1*9 =9
脚本1:
#!/bin/bash
num=9
while [ ${num} -ge 1 ]
do
echo "$num * $num = $[ $num * $num ]"
num=$[ $num -1 ]
done
脚本2:
#!/bin/bash
a=9
b=1
while [ ${a} -ge 1 ]
do
echo "$a * $b = $[ $a * $b ]"
a=$[ $a -1 ]
b=$[ $b -1 ]
done
直到输对了才退出
需求:
1.提示用户输入账号
2.除非输入了root,否则一直提示输入
脚本:
#!/bin/bash
while [ "$user" != "root" ]
do
read -p "请输入root:" user
done
从文本里获取要创建的用户名:密码:uid:gid
#!/bin/bash
exec < name.txt
while read line
do
GROUP=$(echo ${line}|awk -F ":" '{print $1}')
GID=$(echo ${line}|awk -F ":" '{print $4}')
USER=$(echo ${line}|awk -F ":" '{print $1}')
UID=$(echo ${line}|awk -F ":" '{print $3}')
PASS=$(echo ${line}|awk -F ":" '{print $2}')
groupadd ${GROUP} -g ${GID}
useradd ${USER} -u ${UID} -g ${GID}
echo ${PASS}|passwd --stdin
done
猜数字游戏
需求
1.随机生成一个1-100的数字
2.要求用户输入的必须是数字
3.友好提示,如果用户输入的数字比随机数大,则提醒大了,否则提醒小了
4.只有输入正确才退出,输入错误就一直循环
5.最后统计猜了多少次
6期脚本:
需求: 猜数字大小
用户输入一个数字
如果大了,提示大了
如果小了,提示小了
提示完不退出,继续猜
如果猜中了,提示中奖了并退出
脚本如下:
#!/bin/bash
ok_num=$(echo $[$RANDOM%100 + 1])
read -p "please input num:" num
while [ "${num}" != "${ok_num}" ]
do
if [ "$num" -lt "$ok_num" ];then
echo "小了"
else
echo "大了"
fi
read -p "please input num:" num
done
echo "去领奖吧"
脚本:
#!/bin/bash
sj=$(echo $[$RANDOM%100 + 1])
count=0
while true
do
read -p "来下注吧,请输入整数: " num
count=$[ $count+1 ]
if [ ! -z $(echo ${num}|sed -r 's#[0-9]+##g') ];then
echo "你是zzy吗?"
continue
fi
if [ $num == $sj ];then
echo "您成功打爆了zzy的gt ${count}次! 正确数字为: $sj"
exit
fi
if [ $num -gt $sj ];then
echo "你输大了"
else
echo "你输小了"
fi
done
外挂脚本:
#!/bin/bash
#for方法
#for i in {1..100}
#do
# jieguo=$(bash while_v2.sh ${i})
# if [ "$jieguo" == "去找浩斌领奖吧" ];then
# echo "中奖数字为: ${i}"
# exit
# fi
#done
#while方法
num=0
jieguo=0
while [ "$jieguo" != "去找浩斌领奖吧" ]
do
jieguo=$(bash while_v2.sh ${num})
num=$[ $num + 1 ]
done
echo "$[ $num - 1 ]"
限制输错次数
#!/bin/bash
ok_num=10
num=1
while true
do
read -p "please input num:" input_num
if [ "$input_num" -eq ${ok_num} ];then
echo "你猜对了"
exit
else
echo "你输错了"
echo "你还有 $[ 3 - $num ] 次机会"
fi
if [ "$num" -eq 3 ];then
echo "你输错太多了"
exit
fi
num=$[ num + 1 ]
done
不退出的菜单
#!/bin/bash
while true
do
read -p "请输入您的选择:" num
case $num in
1)
echo "选择1"
;;
2)
echo "选择2"
;;
3)
echo "选择3"
;;
exit)
echo "bye"
exit
;;
*)
echo "选择1-3"
esac
done
跳板机脚本
#!/bin/bash
trap "" HUP INT QUIT TSTP
while true
do
echo "
===================
| 1.lb-5 |
| 2.lb-6 |
| 3.web-7 |
| 4.web-8 |
| 5.exit |
===================
"
read -p "请输入需要登陆的主机:" num
case $num in
1)
ssh root@10.0.0.5
;;
2)
ssh root@10.0.0.6
;;
3)
ssh root@10.0.0.7
;;
4)
ssh root@10.0.0.8
;;
5)
exit
;;
*)
continue
esac
done
更新: 2024-06-02 12:27:25