浅谈shell中的while true


在shell中实现死循环,一般都会用 while true,那你知道执行while true时,进程都在做些什么吗?

shell实现死循环

while true
do
	# do something here
done	

以上是shell中实现死循环最常用的方法,今天要说的不是如何实现死循环,而是执行while true时,程序做了哪些事情。

你了解while true中的true吗

可能大部分人都会把true当成shell的关键字,其实在linux下,它是一个可执行文件,用which true可以看到
在这里插入图片描述
执行true时,它什么也不做,只返回表示成功的
在这里插入图片描述
shell中0表示执行成功,非0表示执行失败。

同样的,false也是linux下的一个可执行文件
在这里插入图片描述
执行false时,它也什么都不做,只返回表示失败的

重新认识true和false

在终端下输入man true,可以看到关于true的帮助手册
在这里插入图片描述
同样,man false可以看到关于false的帮助手册
在这里插入图片描述

while true存在的问题

至此,相信你对true和false有了一个新的认识。回到主题,执行while true时,会起一个进程,执行完之后销毁,因此可能会有性能上的消耗,如果对性能有要求,可以使用shell内置的:来实现死循环,即while :while true一个效果。

实现shell死循环的另一种方法

while :
do
	echo $(date +'%F %T')
	sleep 2
done

执行以上代码,会每隔2s打印一次当前时间:
在这里插入图片描述

### Shell 中 `while true` 和 `while true;` 的区别 在 Shell 脚本中,`while true` 和 `while true;` 之间的差异主要体现在语法结构和可读性上。尽管它们的功能几乎相同,但在某些情况下可能会导致不同的行为。 #### 1. `while true` 的含义 `while true` 是一种常见的无限循环写法,表示只要条件为真(即 `true`),就会持续执行循环体中的代码。这里的 `true` 是一个内置命令,它总是返回成功状态(退出码为 0)。因此,`while true` 将永远成立,除非通过 `break` 或外部信号中断循环[^1]。 示例代码: ```bash while true do echo "Looping..." sleep 1 done ``` #### 2. `while true;` 的含义 `while true;` 在功能上与 `while true` 完全一致,但它在语句末尾添加了一个分号(`;`)。分号的作用是明确地告诉 Shell 解释器,当前命令已经结束,并且可以继续解析下一条命令。虽然在大多数情况下,Shell 可以自动识别换行符作为命令的结束标志,但显式使用分号可以提高代码的可读性和一致性[^4]。 示例代码: ```bash while true; do echo "Looping with semicolon..." sleep 1 done ``` #### 3. 两者的主要区别 - **语法风格**:`while true;` 更加显式地指定了命令的结束,这在复杂的脚本中可能有助于避免因换行符或空格引起的解析错误。 - **兼容性**:在绝大多数现代 Shell 实现中(如 Bash、Zsh 等),`while true` 和 `while true;` 的行为完全一致。然而,在某些老旧的 Shell 版本中,可能存在对分号解析的不同规则,因此显式使用分号可能更安全[^2]。 - **可读性**:对于熟悉 Shell 编程的开发者来说,`while true;` 的形式可能更容易理解,因为它明确地表明了命令的结束位置。 #### 4. 注意事项 无论选择哪种写法,都需要注意以下几点: - **防止死循环**:确保在循环体内提供适当的退出机制(如 `break` 或 `exit`),否则可能导致资源耗尽或程序无法终止。 - **性能优化**:如果循环体内的操作较为复杂或耗时较长,应考虑引入延迟(如 `sleep`),以减少 CPU 占用率[^3]。 ```bash while true; do echo "Processing..." if [ some_condition ]; then break fi sleep 1 done ``` ### 示例对比 以下是两种写法的实际对比: #### 使用 `while true` ```bash while true do echo "Running..." sleep 2 done ``` #### 使用 `while true;` ```bash while true; do echo "Running with semicolon..." sleep 2 done ``` 在上述两个例子中,输出结果和运行行为完全相同。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值