#!/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
.
该值$?
在 的参数中使用test
。test
设置$?
为非零值,因为"0"
在词法上等于"0"
。使得"!="
返回test
非零。