我似乎无法在Bash if条件中获取命令执行的退出代码:
#! /bin/bash
set -eu
if ! curl -sS --fail http://not-there; then
echo "ERROR: curl failed with exit code of $?" >&2
fi
但当$?
以非零退出时,curl
始终返回零。
如果我没有在if条件中执行curl
命令,那么我的$?
会正确返回。
我在这里错过了什么吗?
答案 0 :(得分:2)
在原始代码中,$?
返回的退出状态不是curl
,而是! curl
。
要保留原始值,请选择不需要反转的控制结构:
curl -sS --fail http://not-there || {
echo "ERROR: curl failed with exit code of $?" >&2
exit 1
}
......或类似的东西:
if curl -sS --fail http://not-there; then
: "Unexpected success"
else
echo "ERROR: curl failed with exit status of $?" >&2
fi
答案 1 :(得分:1)
实现您想要做的事情的另一种方法是先收集返回码,然后执行if
语句。
#!/bin/bash
set -eu
status=0
curl -sS --fail http://not-there || status=$?
if ((status)) then
echo "ERROR: curl failed with exit code of $status" >&2
fi
如果您想在脚本或函数末尾返回错误代码(如果其中任何一个失败),则在检查多个命令失败时,我发现此方法特别方便。
请注意,在上面我使用了算术测试,如果里面的值是非零则返回true(0),否则返回false(非零)。与使用像[[ $status != 0 ]]
这样的东西相比,它更短(并且更符合我自己的口味)。