跳到主要内容

第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