目录
while 在 shell 中也是负责循环的语句,和for一样。因为功能一样,很多人在学习和工作中的脚本遇到循环到底该使用for还是while呢?很多人不知道,就造就了有人一遇到循环就是for或者一味的while。
我个人认为可以按照我说的这个思想来使用,既知道循环次数就可以用for,比如说一天需要循环24次;如果不知道代码要循环多少次,那就用while,比如我们作业中要求写的猜数字,每个人猜对一个数字的次数都是不能固定的,也是未知的。所以这样的循环我就建议大家用while了。
一、while 介绍
特点:条件为真就进入循环,条件为假就退出循环,一般应用在未知循环次数的环境。
1.1 while 语法
while [ 表达式 ]
do
command...
done
# 如:
while [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
command
command
...
done
案例
使用for循环和while循环分别循环打印数组1-5
案例代码
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++
#i=$((i+1))
done
[root@shell ~]# vim while-1.sh
[root@shell ~]# sh while-1.sh
1
2
3
4
5
备注: 知道循环次数就可以用for,比如说一天需要循环24次;如果不知道代码要循环多少次,那就用while,比如猜数字,每个人猜对一个数字的次数都是不能固定的,也是未知的。
二、while 与 shell 运算
2.1 比较运算
案例:
循环交互输入一个小写字母,按 Q 退出循环
[root@shell ~]# vim while-2.sh
#!/bin/bash
read -p "请输入一个字符[按'Q'退出]: " choose
while [ $choose != 'Q']
do
echo "你输入的字符是:$choose"
read -p "请输入一个字符[按'Q'退出]: " choose
done
[root@shell ~]# vim while-2.sh
[root@shell ~]# sh while-2.sh
请输入一个字符[按'Q'退出]: s
你输入的字符是:s
请输入一个字符[按'Q'退出]: 2
你输入的字符是:2
请输入一个字符[按'Q'退出]: e
你输入的字符是:e
请输入一个字符[按'Q'退出]: Q
2.2 逻辑运算
案例:
使用循环语句帮助丈母娘批量选择女婿
[root@shell ~]# vim while-3.sh
#!/bin/bash
#丈母娘选女婿。进行与或非模拟
# 第一个应征者回答
read -p "你有多少钱: " money
read -p "你有多少车: " car
read -p "你家房子有几套: " house
# 应征者不满住条件开始下一次循环
#while [ $money -lt 10000 ]&&[ $car -lt 1 ]&&[ $house -lt 2 ]
while [ $money -lt 10000 ]||[ $car -lt 1 ]||[ $house -lt 2 ]
do
echo "有请下一个"
read -p "你有多少钱: " money
read -p "你有多少车: " car
read -p "你家房子有几套: " house
done
# 应征者满足条件
echo "乖女婿,你怎么才来啊!女儿给你了"
效果展示
2.3 文件类型判断
案例:
使用循环判断 /tmp/xxx 目录下的文件,如果不是文件类型的打印字符串"haha"
[root@shell ~]# vim while-4.sh
#!/bin/bash
while [ ! -f /tmp/xxx ]
do
echo “目录”
sleep 1
done
[root@shell ~]# sh while-4.sh
“haha”
“haha”
“haha”
“haha”
^C
2.4 特殊条件
while 语句中可以使用特殊条件来进行循环
- 符号 ":" 条件代表真,适用于无限循环
- 字符串 “true” 条件代表真,适用于无限循环
- 字符串 "false" 条件代表假
[root@shell ~]# vim while-4.sh
#!/bin/bash
#while [ ! -f /tmp/test.txt ]
while true
do
echo “haha”
sleep 1
done
[root@shell ~]# sh while-4.sh
“haha”
“haha”
“haha”
“haha”
^C
三、while 与循环控制语句
3.1 sleep 语句
#!/bin/bash
#Description: 倒计时游戏
#1. 定义初始值
time=9
#2. 循环输出,1秒一次
while [ $time -ge 0 ]
do
echo -n -e "\b$time"
let time--
# 控制循环 1秒一次
sleep 1
done
# 回车
echo
3.2 break
#!/bin/bash
#Description: 输出数字1-9,当输出5时停止
# 定义初始值
num=1
while [ $num -lt 10 ]
do
echo $num
# 判断当前num的值,如果等于5就跳出循环
if [ $num -eq 5 ]
then
break
fi
# 自动累加
let num++
done
3.3 continue
#!/bin/bash
#Description: 输出数字1-9,当等于5时跳过本次循环,输出1、2、3、4、6、7、8、9
# 定义初始值
num=0
while [ $num -lt 9 ]
do
# 自动累加
let num++
# 判断当前num的值,如果等于5就跳过本次循环
if [ $num -eq 5 ]
then
continue
fi
# 输出num的值
echo $num
done
四、while 嵌套其他语句
4.1 while 嵌套 if
循环中需要判断的时候:
#!/bin/bash
#Description: 输出数字1-9,当输出5时停止
# 定义初始值
num=1
while [ $num -lt 10 ]
do
echo $num
# 判断当前num的值,如果等于5就跳出循环
if [ $num -eq 5 ]
then
break
fi
# 自动累加
let num++
done
4.2 while 嵌套 for
多次循环的场景,内循环需要依赖外循环:
#!/bin/bash
#Description: 99乘法表
A=1
while [ $A -lt 10 ]
do
for ((B=1;B<=$A;B++))
do
echo -n -e "$B*$A=$((A*B)) \t"
done
echo
let A++
done
4.3 while 嵌套 while
#!/bin/bash
#Description: 99乘法表
# 定义A
A=1
while [ $A -lt 10 ]
do
# 定义B
B=1
while [ $B -le $A ]
do
echo -n -e "$B*$A=$((A*B)) \t"
let B++
done
echo
let A++
done
上一篇文章:【Shell 脚本速成】09、Shell 循环控制语句 for_Stars.Sky的博客-CSDN博客
参考文档:流程控制-while循环-组团学