linux 对bash脚本中的if条件求反

2nc8po8w  于 2023-01-01  发布在  Linux
关注(0)|答案(5)|浏览(335)

我一直在尝试否定以下命令:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

如果我连接到互联网,这个if条件返回true。我希望它以相反的方式发生,但是把!放在任何地方似乎都不起作用。

lndjwyie

lndjwyie1#

您可以选择:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

!分别反转以下表达式的返回值。

cyvaqqii

cyvaqqii2#

更好

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi
z18hc3ub

z18hc3ub3#

如果你觉得很懒,下面是一个简洁的方法,在操作之后使用||(or)和&&(and)来处理条件:

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }
iugsix8n

iugsix8n4#

由于要比较数字,因此可以使用算术表达式,这样可以更简单地处理参数和比较:

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"

工作得很好,但是这不适用于$?特殊参数。
此外,由于(( ... ))将非零值求值为真,即,对于非零值具有返回状态0,否则具有返回状态1,因此我们可以将其缩短为

if (( $? )); then

但这可能会让更多的人感到困惑,而不是节省的击键值多少钱。
(( ... ))结构在Bash中可用,但POSIX shell规范并不要求它(尽管提到了可能的扩展)。
话虽如此,在我看来,最好还是完全避免$?,就像Cole's answerSteven's answer一样。

m4pnthwp

m4pnthwp5#

可以使用不等比较-ne代替-eq

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi

相关问题