You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动