我没有使用退出代码从此if语句和回显提示中得到预期的结果

时间:2019-05-08 07:29:36

标签: linux bash

因此,我正在尝试编写一个脚本,该脚本根据最后一个退出代码的含义给出不同的响应/回显提示。这个imo应该可以正常工作,因为此脚本会在每分钟使用crontab运行时运行,因此不会影响最后一个退出代码。但是,无论退出值是多少,我都不会收到提示。

我尝试使用echo来简单地显示RESULT(exit-code)的值,该值曾经起作用,但现在似乎在使用crontab时不显示。我确保脚本使用'else'语句和'logger -s'运行,但是该脚本会发送一条日志,说明实际退出代码是否等于0,并且仅在值是0时才发送该日志。实际上等于0。我尝试了不同的运算符,等等。但是似乎无法实际发送“ echo”提示。

#!/bin/bash

RESULT=$(echo "$?")


        if [ $RESULT -gt 0 ]
        then
                echo "Value is greater than 0"
        else [ $RESULT -eq 0 ]

                echo "Value is equal to 0"
fi

这让我发疯,因为我觉得这不应该那么困难,但显然是哈哈。预期的结果是,当最后输入的命令的退出代码为“ 0”时,它应该给出一个回显promt,而当退出代码大于“ 0”时(该命令失败),它应该给出一个不同的值,但是相反,除非我将其发送到日志,否则什么也不会发生,在这种情况下,它几乎总是在那里结束。

3 个答案:

答案 0 :(得分:1)

问题是$(... )是一个子外壳。 echo之前没有以前的状态。

所以只需使用

RESULT=$?
...

答案 1 :(得分:1)

这里至少存在三个问题:

  1. $?获取由该特定shell 运行的最后一条命令的退出状态;由于这是脚本的开头,因此没有最后一个命令,因此默认为“ 0”。

  2. cron作业的输出不会发送到终端,基本上会被忽略。

  3. else [ $RESULT -eq 0 ]没有任何用处,因为else关键字没有条件。 (从技术上讲,它确实作为常规命令执行测试,但结果被忽略。)

还有一些奖励建议:

  1. 请勿使用$(echo ...)echo $(...),而$( )echo大多会互相抵消。

  2. 使用小写或混合大小写的变量名(例如,result而不是RESULT)。一堆具有特殊含义的全大写字母名称,如果您不小心将其中一个大写字母用于其他用途,可能会引起问题。小写和大小写混合的名称避免了这种风险。

答案 2 :(得分:0)

您正在尝试使用RESULT将命令的最后状态分配给$?,该状态将返回1或0。但是在分配之前甚至设置{{ 1}},因此您的if语句将永远无法达到预期的结果。