如何使用$?并测试以检查功能?

如何使用$?并测试以检查功能?
    #!/bin/sh

function checkExit(){
    if test "$?" != "0"; then
      echo Command $1 exited with abnormal status
      exit 1;
    else echo $?
    fi
}

function echoThenRun () { # echo and then run the command
  echo $1
  $1
  ret=$?
  echo $ret
  return $ret
}
file=test_file
echo > $file
echoThenRun "test -f $file"
checkExit $file
echo "all right!"

执行脚本的输出:

$  ~/Downloads/test.sh 
test -f test_file
0
1 # why 1 here??
all right!

答案1

对于您正在做的事情,有一种更简单的方法。如果您使用set -x(或set -o xtrace- 相同的东西),脚本将在执行之前自动回显每一行。

此外,一旦您执行另一个命令,$?就会替换为该命令的退出代码。

如果您打算用它做任何事情而不是快速测试并忘记,则必须将其备份到变量。它[实际上是一个有自己的退出代码的程序。

用于set +x回显命令

例如:

(
    set -x # Cause commands to echo, but ONLY inside of this (...)
    execute some command...
    # Any further commands in these parens will also echo.
)
# Command echoing will be OFF at this point because we're outside of the (...).
# Now, $? holds the exit code of the (...) which gets it from the
# exit code of the last command executed inside of it.
result=$?
if [ "$result" -ne 0 ]; then
    echo "Your command exited with non-zero status $result"
fi

这将打印在 stderr 上:

+ execute some command...

替代方法为set +x

您还可以使用set +x之后禁用命令回显:

set -x # Cause commands to echo
execute some command...
result=$?
set +x # Turn off command echoing

然而这种方法不太干净,最终在 stderr 上打印:

+ execute some command...
+ result=127
+ set +x

答案2

在我看来,该命令test "$?" != "0"最终设置$?1.

该值$?在 的参数中使用testtest设置$?为非零值,因为"0"在词法上等于"0"。使得"!="返回test非零。

相关内容