Shell脚本执行if语句时崩溃,求故障原因分析(附问题脚本)
脚本崩溃原因分析与修复
咱们直接拆解问题,先解决导致崩溃的核心问题,再聊聊逻辑上的无效设计:
1. 直接引发崩溃的语法错误
你在if判断里用了反引号`包裹expr命令,这会让shell把expr的执行结果当作可执行命令去运行,而不是作为条件比较的左值。举个实际例子:
当hi=0时,expr $hi % 5的计算结果是0,这时候你的if语句会被解析成:
if 0 -eq 5
shell会尝试执行0这个“命令”,但系统里根本没有叫0的可执行程序,直接就会抛出command not found的错误,导致脚本崩溃。
正确的做法是用[](shell的测试命令)来包裹条件判断,把expr的结果作为测试参数,比如写成:
if [ $(expr $hi % 5) -eq 5 ]
这里的$(expr ...)是命令替换,只会把计算结果代入条件,不会把结果当作命令执行。
2. 逻辑上的无效设计
咱们再看脚本的目标:检查hi模5的结果是否等于5、6、7。但从数学逻辑来说,一个数模5的结果范围只能是0、1、2、3、4,永远不可能出现5、6、7这几个值,所以你的三个条件永远都不会触发,这部分逻辑完全无效。
我猜你可能是想检查hi除以5的商等于5、6、7?或者是模5的结果等于0、1、2这类合理值?如果是后者,调整一下比较的数值就能让逻辑生效。
修复后的示例脚本
假设我们修正语法错误,同时把条件改成合理的模5结果(比如0、1、2),脚本可以写成这样:
for hi in $(seq 0 100) do new_val=1 if [ $(expr $hi % 5) -eq 0 ] then echo hello elif [ $(expr $hi % 5) -eq 1 ] then echo bye elif [ $(expr $hi % 5) -eq 2 ] then echo whats up fi echo $new_val done
另外,也可以用bash内置的算术运算替代expr,效率更高:
for hi in {0..100} do new_val=1 mod_result=$((hi % 5)) if [ $mod_result -eq 0 ] then echo hello elif [ $mod_result -eq 1 ] then echo bye elif [ $mod_result -eq 2 ] then echo whats up fi echo $new_val done
内容的提问来源于stack exchange,提问作者Tinler




