我被困在试图否定以下命令:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
如果我连接到互联网,这个if条件返回真。我希望它发生相反的方式,但放!哪里都不行。
我被困在试图否定以下命令:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
如果我连接到互联网,这个if条件返回真。我希望它发生相反的方式,但放!哪里都不行。
你可以选择:
if [[ $? -ne 0 ]]; then # -ne: not equal
if ! [[ $? -eq 0 ]]; then # -eq: equal
if [[ ! $? -eq 0 ]]; then
! 分别对下面表达式的返回值求反。
你可以用不相等的比较-ne代替-eq:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
echo "Sorry you are Offline"
exit 1
fi
如果你觉得懒惰,这里有一个简单的方法,在操作后使用|| (or)和&& (and)来处理条件:
wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
更好的
if ! wget -q --spider --tries=10 --timeout=20 google.com
then
echo 'Sorry you are Offline'
exit 1
fi
因为你在比较数字,你可以使用算术表达式,这允许更简单的参数处理和比较:
wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
echo "Sorry you are Offline"
exit 1
fi
注意,您可以使用!=代替-ne。在算术上下文中,我们甚至不需要在参数前加上$,即,
var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"
工作得很好。这不适用于$?这是一个特殊的参数。
此外,由于((…))将非零值计算为true,即非零值返回状态为0,否则返回状态为1,我们可以缩短为
if (( $? )); then
但这可能会让更多的人感到困惑,而不是保存按键的价值。
(…)构造在Bash中是可用的,但不是POSIX shell规范所要求的(尽管被提到为可能的扩展)。
综上所述,最好避免使用美元?在我看来,就像科尔和史蒂文的回答一样。