声明:
本文的学习内容来源于B站up主“泷羽sec”视频【shell(7)for循环与while循环】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,请联系本人,我将立即删除相关内容。
本文旨在帮助网络安全爱好者提升自身安全技能,并严格遵守国家法律法规。任何人利用本文中的信息从事违法活动,均与本文作者和“泷羽sec”无关。请读者自觉遵纪守法,合理合法使用相关知识。
在Linux中,while循环是一种常见的控制流工具,用于在满足条件时反复执行一组命令。在实际开发中,根据条件表达式的复杂程度,我们可以选择不同的条件判断方式,比如单中括号 [ ]
和双括号 (( ))
。
1 while循环的基本语法
while循环的基本结构如下:
while 条件
do
命令1
命令2
...
done
其中,条件可以通过单中括号 [ ]
或双括号 (( ))
来定义。二者的选择取决于条件类型,具体差异如下:
特性 | [ ] 单中括号 | (( )) 双括号 |
---|---|---|
适用场景 | 通用条件测试 | 数值和逻辑运算 |
支持操作符 | -eq 、-lt 、-z 、-f 等 | + 、- 、* 、/ 、&& 、` |
变量引用 | 必须显式引用 $ | 无需 $ 明确引用 |
性能 | 调用外部命令,效率稍低 | 内置于 Bash,性能更高 |
2 使用单中括号的while循环
单中括号 [ ]
通常用于通用条件测试,例如字符串比较、文件检查或数值比较。以下是一个使用 [ ]
的简单示例:
#!/bin/bash
i=1
while [ $i -le 10 ]
do
echo $i
let "i++" # Bash内置命令
done
关键点:
[ $i -le 0 ]
判断变量i
是否小于等于10。let
不返回具体运算结果,不能直接用作条件判断,支持基本运算符,不支持嵌套运算,多个表达式之间用空格隔开,可以在一条命令中完成多步计算。
3 使用双括号的while循环
双括号 (( ))
是 Bash 的内置特性,主要用于处理算术运算和逻辑表达式。它比 [ ]
更简洁,尤其适用于数值计算:
#!/bin/bash
i=1
while (( i<=10 ))
do
echo $i
(( i++ )) # Bash内置特征
done
关键点:
- 条件判断
( i <= 10 )
更加直观,无需使用-gt
等符号。 - 无需显式引用变量
$
,代码更清晰。 (())
返回运算结果(0 为假,非零为真),可直接用于条件判断,支持逻辑、关系、位运算符等更多操作,支持复杂嵌套运算。
4 使用break和continue控制循环
在while循环中,可以结合 break
和 continue
实现更灵活的流程控制:
#!/bin/bash
counter=10
while (( counter > 0 ))
do
if (( counter == 5 )); then
echo "Breaking the loop at counter: $counter"
break
fi
if (( counter % 2 == 0 )); then
echo "Skipping even number: $counter"
((counter--))
continue
fi
echo "Counter: $counter"
((counter--))
done
break
用于提前退出循环。continue
用于跳过当前循环的剩余部分,直接进入下一次循环。
运行结果:
Skipping even number: 10
Counter: 9
Skipping even number: 8
Counter: 7
Skipping even number: 6
Breaking the loop at counter: 5
5 从文件读取数据的while循环
while
循环还能用于处理文件中的内容,例如逐行读取文件:
#!/bin/bash
filename="example.sh"
while IFS= read -r line
do
echo "Processing: $line"
done < "$filename"
- 关键点:
- 使用
IFS=
防止空格或换行符被忽略。 - 使用
< "$filename"
将文件内容作为while
循环的输入。
- 使用
运行结果:
Processing: #!/bin/bash
Processing: filename="example.sh"
Processing: while IFS= read -r line
Processing: do
Processing: echo "Processing: $line"
Processing: done < "$filename"
6 while循环中的无限循环
有些场景需要创建一个永不停止的循环,比如定期检测某些服务状态。可以这样实现:
#!/bin/bash
while true
do
echo "Monitoring system... (Press Ctrl+C to stop)"
sleep 5
done
true
是一个永远返回0(真)的命令,确保循环不会中断。sleep 5
用于降低CPU使用率,暂停5秒后继续循环。
7 单中括号与双括号的选择建议
- 使用
[ ]
:如果条件中涉及字符串比较、文件检查或其他非算术操作,选择[ ]
。 - 使用
(( ))
:如果条件主要是数值计算或逻辑运算,选择(( ))
更简洁高效。 - 如果可能,优先选择
(( ))
,因为它性能更高,且语法直观。