Linux I';m使用退出代码无法从此if语句和回显提示中获得预期结果

Linux I';m使用退出代码无法从此if语句和回显提示中获得预期结果,linux,bash,Linux,Bash,因此,我尝试使用一个脚本,根据最后一个退出代码给出不同的响应/回显提示。imo认为,这应该可以工作,因为这个脚本每分钟都在运行crontab,因此它不会影响最后的退出代码。然而,无论退出值是多少,我都不会得到任何提示 我曾经尝试过使用echo简单地显示结果(退出代码)的值,它过去可以工作,但现在似乎在使用crontab时不显示。我已经确保脚本通过使用'else'语句和'logger-s'运行,但是无论实际退出代码是否等于0,它都会发送日志,并且只有当值实际等于0时才会发送。我尝试了不同的操作符等

因此,我尝试使用一个脚本,根据最后一个退出代码给出不同的响应/回显提示。imo认为,这应该可以工作,因为这个脚本每分钟都在运行crontab,因此它不会影响最后的退出代码。然而,无论退出值是多少,我都不会得到任何提示

我曾经尝试过使用echo简单地显示结果(退出代码)的值,它过去可以工作,但现在似乎在使用crontab时不显示。我已经确保脚本通过使用'else'语句和'logger-s'运行,但是无论实际退出代码是否等于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”时,它应该发出一个echo promt,当退出代码大于“0”时,它应该发出一个不同的值(命令失败),但相反,除非我将其发送到日志,否则不会发生任何事情,在这种情况下,它几乎总是在那里结束。

问题是
$(…)
是子shell。在
echo
之前没有以前的状态

所以只要使用

RESULT=$?
...

您正试图使用返回1或0的
$?
将命令的最后一个状态分配给
RESULT
。但是在分配之前,我没有看到任何命令,甚至没有设置
RESULT
的初始值,因此您的if语句永远不会达到所需的结果。

这里至少有三个问题:

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

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

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

  • 还有一些额外的建议:

  • 不要使用
    $(echo…
    echo$(…)
    -
    $()
    echo
    通常会相互抵消

  • 使用小写或混合大小写的变量名(例如,
    result
    而不是
    result
    )。有一大堆具有特殊含义的大写名称,如果您意外地将其中一个用于其他用途,可能会导致问题。小写和混合大小写的名称可以避免这种风险


  • 子shell在这里实际上不是问题,因为子shell继承了
    $?
    。缺少以前的命令是一个问题。@GordonDavisson为什么要注释而不回答?@ceving I…想不出一个好的理由。所以我将我的注释转换为答案。好的,谢谢!您建议我如何让脚本在不使用crontab的情况下按间隔运行?@simedr如果您想访问某个特定shell运行的最后一个命令的退出状态,您需要在该shell中运行。这意味着没有脚本(脚本在其自己的shell中运行),并且在运行的shell中也没有标准的方法来做周期性的事情。根据实际目标,您可能可以使用或执行某些操作。