目录
一、while 介绍
1.1 while 语法
二、while 与 shell 运算
2.1 比较运算
2.2 逻辑运算
2.3 文件类型判断
2.4 特殊条件
三、while 与循环控制语句
3.1 sleep 语句
3.2 break
3.3 continue
四、while 嵌套其他语句
4.1 while 嵌套 if
4.2 while 嵌套 for
4.3 while 嵌套 while
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
参考文档:流程控制-while循环-组团学