Shell 脚本流程控制语句详解(四):while 循环详解
在编程中,循环结构能让我们反复执行一段代码,极大地提高脚本的自动化能力。while
循环是 Shell 脚本中常用的循环语句之一,它根据条件判断是否继续执行循环体。
本文将详细介绍 while
循环的语法、用法、实例及注意事项,帮助你灵活运用 while
循环写出高效的脚本。
目录
- 什么是 while 循环?
- while 循环基本语法
- 示例详解
- 使用 break 和 continue 控制循环
- 无限循环
- 常见错误及调试技巧
1. 什么是 while 循环?
while
循环会先判断条件表达式的真假,如果为真(返回状态码为0),则执行循环体;条件为假时停止循环。
这意味着循环次数不是固定的,而是根据条件动态决定。
2. while 循环基本语法
while [ 条件 ]
do命令序列
done
- 条件:通常是一个返回真假状态的表达式,比如比较语句、文件测试等。
do
和done
包含了循环执行的命令块。
3. 示例详解
1:计数循环
#!/bin/bashcount=1while [ $count -le 5 ]
doecho "当前计数:$count"count=$((count + 1))
done
说明:
- 变量
count
初始为1。 - 条件
[ $count -le 5 ]
判断计数是否小于等于5。 - 每次循环后计数加1。
- 条件不满足时循环结束。
2:读取文件每行内容
#!/bin/bashfilename="test.txt"while read line
doecho "读取行内容:$line"
done < "$filename"
说明:
- 使用
read
逐行读取文件内容。 < "$filename"
将文件内容作为输入传递给循环。
4. 使用 break 和 continue 控制循环
break
:跳出当前循环,终止循环执行。continue
:跳过本次循环后续命令,直接开始下一轮循环判断。
1:使用 break
#!/bin/bashcount=1while [ $count -le 10 ]
doif [ $count -eq 3 ]; thenecho "到达3,退出循环"breakfiecho "计数:$count"count=$((count + 1))
done
**注意:**看条件的执行先后顺序,当while
达到3
的时候,就不在进行计数了,执行完if
就直接退出了循环
2:使用 continue
#!/bin/bashcount=0while [ $count -lt 5 ]
docount=$((count + 1))if [ $count -eq 3 ]; thenecho "跳过3"continuefiecho "计数:$count"
done
5. 无限循环
有时需要无限循环,直到外部条件触发退出:
#!/bin/bashwhile true
doecho "按 Ctrl+C 退出循环"sleep 1
done
这个我们在动态的查看日志的时候最能体现出来,tail -f file.log
6. 常见错误及调试技巧
- 条件语法错误:
[
和]
两侧必须空格,如[ $count -le 5 ]
。 - 变量未初始化:使用变量前要赋初值,避免空值导致错误。
- 死循环:循环条件始终为真,且循环体内未改变条件,导致无法退出。
- 调试技巧:使用
set -x
开启调试,观察执行细节。
7. 小结
while
循环根据条件判断动态决定是否执行循环体。- 适合处理需要循环次数不确定的场景,如读取文件、等待事件等。
- 可配合
break
和continue
灵活控制循环流程。 - 编写时注意语法规范,避免死循环。
- 掌握
while
循环是写好 Shell 脚本的重要技能。
如果你真的在跟着我学习,请把下面的这个题做了,需要源代码参考的,看第二篇文章
“数字猜猜乐”游戏
1.程序自动生成一个 1 到 100 的随机整数。
2.用户最多有 7 次猜测机会。
3.每次提示用户输入一个数字:
4.如果不是合法整数,提示错误并让用户重新输入(使用 continue)。
5.如果猜大了,提示“太大了!”。
6.如果猜小了,提示“太小了!”。
7.如果猜对了,提示“恭喜你猜对了!”,并显示用了几次机会。
8.如果用户在规定次数内没有猜中,提示:“很遗憾,你没有猜中。正确答案是:XX”
9.在每次猜测后显示剩余次数。
10.猜完之后询问用户是否再玩一次(输入 y 继续,其他键退出)
提示:
- 使用 $RANDOM 生成随机数。
- 使用 while 实现主循环。
- 使用正则表达式校验输入是否为数字。
- 使用变量记录尝试次数、剩余次数、最佳成绩。
- 使用嵌套的 while 控制是否重玩游戏。
正则表达式不会的同学,可以参考这个[[ "变量" =~ ^[0-9]+$ ]]
- =~ 表示使用正则表达式进行匹配
^[0-9]+$
正则表达式本身,用来判断一个变量是否为纯数字字符串