在 while 循环里,每进行一次循环,条件都会被判断一次,来确定本次循环是否该继续。
while循环语句主要用来重复执行一组命令或语句,一直到条件不再满足为止,常用于守护进程或持续运行的程序。
格式
一般格式
while <条件表达式> #条件表达式为真则执行下面的命令集
do
命令集/程序
done
2、死循环格式
while true //或真或假
do
命令集
done
死循环的条件一定是为真的。
3、按行读取相应的文件内容并处理
while read line
do
命令集/程序
done < path to file
条件表达式
死循环
[root@ldpbzhaonan bash]$ cat while01.sh
while [[ 1+1 ]]
do
echo ‘'a'
done
条件就是因为1+1永远为真,所以条件永远成立,所以会一直执行。也就是所谓的死循环。
设置限制条件
例子一
[root@LDP ~]# cat 4.sh
a=1
#设置变量
while (( $a <= 6))
#相当于设置一个限制,循环到a小于等于6就停止循环。
do
#开始循环
echo $a
第一次循环输出1
let "a++"
#设置a不断加一,如果此时a=1 则输出。本输出完成之后,a=2,再回到上面查看逻辑是否成立。以此类推
#换句话说,就是只要a只要不大于6,此循环就会一直循环下去
done
[root@LDP ~]# bash 4.sh
1
2
3
4
5
6
例子二
[root@ldpbzhaonan bash]$ cat while01.sh
nb=1
nc=6
while [ ${nb} -le ${nc} ]
do
echo ${nb}
(( nb++ ))
done
[root@ldpbzhaonan bash]$ bash while01.sh
1
2
3
4
5
6
设置变量nb初始值为1,设置如果条件nb小于nc,则输出nb的变量。
(( nb++ )) 就是初始每循环一次,nb值加1。
这样的话nb一直变为6,则条件不成立,则停止输出。
死循环格式
例子一
[root@ldpbzhaonan bash]$ cat while02.sh
while [ 1 ]
do
printf "你好\n"
sleep 5
done
[root@ldpbzhaonan bash]$ bash while02.sh
你好
你好
你好
这里就是使用了数字1会一直存在,所以会一直输出你好。
sleep在这里就是让脚本每五秒执行一次
例子二
[root@ldpbzhaonan bash]$ cat while03.sh
while true
do
printf "你好\n"
sleep 3
done
[root@ldpbzhaonan bash]$ bash while03.sh
你好
你好
你好
按行读取相应的文件内容并处理
read命令
[root@ldpbzhaonan bash]$ read name
yjs
[root@ldpbzhaonan bash]$ echo ${name}
yjs
输入read后面跟变量名称 ,使用键盘输入变量的值。执行变量名称(${变量名称}),就会根据需要显示该变量。
例子一
[root@ldpbzhaonan bash]$ cat while04.sh
printf "请填写您的年龄: "
# 输出提示信息,要求用户输入年龄
while read name
# 使用循环读取用户的输入,并将其存储在变量name中
do
printf "您输入的年龄是:${name}\n"
# 输出用户输入的年龄
done
[root@ldpbzhaonan bash]$ bash while04.sh
请填写您的年龄: 10
您输入的年龄是:10
20
您输入的年龄是:20
30
您输入的年龄是:30
这里就是将用户输入的内容会存储在name里面,用户输入不同的内容,name的变量也会不同。并且这段代理会不断的执行下去,除非用户手动停止。
设置停止条件
[root@ldpbzhaonan bash]$ cat while04.sh
printf "请填写您的年龄: "
while read name
do
printf "您输入的年龄是:${name}\n请填写您的年龄: "
if [ ${name} == 100 ]
then
printf "程序退出\n"
exit
fi
done
[root@ldpbzhaonan bash]$ bash while04.sh
请填写您的年龄: 20
您输入的年龄是:20
请填写您的年龄: 100
您输入的年龄是:100
请填写您的年龄: 程序退出
这里就是判断变量为100的话,脚本执行exit。也就是退出。
循环嵌套
输入重定向
[root@ldpbzhaonan bash]$ cat while05.sh
while read line
do
echo ${line}
done < /etc/passwd|head
[root@ldpbzhaonan bash]$
[root@ldpbzhaonan bash]$ bash while05.sh
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
while read line
:使用 while 循环,每次读取一行数据到变量 line 中。do
:开始循环体。echo ${line}
:输出当前行的内容。done
:结束循环体。< /etc/passwd
:将 /etc/passwd 文件作为输入。head
:只输出前10行内容。
终止循环
break
直接终止当前循环,不在执行之后的代码
[root@ldpbzhaonan bash]$ cat while07.sh
counter=0
while [ $counter -lt 5 ]
do
((counter++))
if [ $counter -eq 3 ]
then
break
fi
echo "Cure:$counter"
done
[root@ldpbzhaonan bash]$ bash while07.sh
Cure:1
Cure:2
continue
还会执行之后的代码
[root@ldpbzhaonan bash]$ cat while07.sh
counter=0
while [ $counter -lt 5 ]
do
((counter++))
if [ $counter -eq 3 ]
then
continue
fi
echo "Cure:$counter"
done
[root@ldpbzhaonan bash]$ bash while07.sh
Cure:1
Cure:2
Cure:4
Cure:5