Linux I';m使用退出代码无法从此if语句和回显提示中获得预期结果
因此,我尝试使用一个脚本,根据最后一个退出代码给出不同的响应/回显提示。imo认为,这应该可以工作,因为这个脚本每分钟都在运行crontab,因此它不会影响最后的退出代码。然而,无论退出值是多少,我都不会得到任何提示 我曾经尝试过使用echo简单地显示结果(退出代码)的值,它过去可以工作,但现在似乎在使用crontab时不显示。我已经确保脚本通过使用'else'语句和'logger-s'运行,但是无论实际退出代码是否等于0,它都会发送日志,并且只有当值实际等于0时才会发送。我尝试了不同的操作符等,但似乎没有任何东西能够真正发送“echo”提示Linux I';m使用退出代码无法从此if语句和回显提示中获得预期结果,linux,bash,Linux,Bash,因此,我尝试使用一个脚本,根据最后一个退出代码给出不同的响应/回显提示。imo认为,这应该可以工作,因为这个脚本每分钟都在运行crontab,因此它不会影响最后的退出代码。然而,无论退出值是多少,我都不会得到任何提示 我曾经尝试过使用echo简单地显示结果(退出代码)的值,它过去可以工作,但现在似乎在使用crontab时不显示。我已经确保脚本通过使用'else'语句和'logger-s'运行,但是无论实际退出代码是否等于0,它都会发送日志,并且只有当值实际等于0时才会发送。我尝试了不同的操作符等
#!/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”else[$RESULT-eq 0]
没有做任何有用的事情,因为else
关键字不带条件。(从技术上讲,它确实作为常规命令执行测试,但结果被忽略。)$(echo…
或echo$(…)
-$()
和echo
通常会相互抵消result
而不是result
)。有一大堆具有特殊含义的大写名称,如果您意外地将其中一个用于其他用途,可能会导致问题。小写和混合大小写的名称可以避免这种风险子shell在这里实际上不是问题,因为子shell继承了
$?
。缺少以前的命令是一个问题。@GordonDavisson为什么要注释而不回答?@ceving I…想不出一个好的理由。所以我将我的注释转换为答案。好的,谢谢!您建议我如何让脚本在不使用crontab的情况下按间隔运行?@simedr如果您想访问某个特定shell运行的最后一个命令的退出状态,您需要在该shell中运行。这意味着没有脚本(脚本在其自己的shell中运行),并且在运行的shell中也没有标准的方法来做周期性的事情。根据实际目标,您可能可以使用或执行某些操作。