退出代码作为变量? $?始终为零

时间:2018-05-14 13:43:53

标签: bash

我注意到一些奇怪的东西(至少对我来说这很奇怪)。我正在写一个脚本,我需要0或1作为退出代码。到现在为止还挺好。我有一个简单的if-else与echo $?在每个条件之上,但当我做回声$?作为一个变量来调用它总是显示0作为退出代码。

#!/bin/bash

exit=`echo $?`

DIRECTORY="/some/dir"

if [[ $(stat -c "%a" "$DIRECTORY") == "777" ]]
then
        echo $?
        #echo "The exit code is: $exit"
else
        echo $?
        #echo "The exit code is: $exit"
fi

#EOF

如果只使用" echo $?"一切都很好。我收到0或1.但在评论部分我总是收到0。

2 个答案:

答案 0 :(得分:4)

$?构造包含最后一个命令的状态代码 - 完全最后一个命令。

[[是一个命令(bash测试)。因此,您正在测试测试结果。

要修复它,请先保存结果。例如:

result=$(stat -c "%a" "$DIRECTORY")
status=$?
... do stuff with status and result

答案 1 :(得分:3)

您可以在代码顶部设置exit的值。整个脚本中保持不变。这就是为什么你总是得到相同的价值。

相反:

#!/bin/bash

dir='/some/dir'

if [[ "$(stat -c "%a" "$dir")" == "777" ]]; then
    status=0
    printf 'Permissions are 777 (status=%d)\n' "$status"
else
    status=1
    printf 'Permissions are not 777 (status=%d)\n' "$status"
fi

#!/bin/sh

dir='/some/dir'

case "$(stat -c "%a" "$dir")" in
    777) echo 'Permissions are 777';     status=0 ;;
    *)   echo 'Permissions are not 777'; status=1 ;;
esac

请注意,此处无需调查$?。如果测试成功,您知道它将为0,否则为非零。