Отрицание, если условие в скрипте bash

Я новичок в bash и застрял при попытке отменить следующую команду:

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

Это если условие возвращает истину, если я подключен к Интернету. Я хочу, чтобы это произошло наоборот, но положить ! кажется, нигде не работает.

5 ответов

Решение

Ты можешь выбрать:

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

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

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

! инвертирует возврат следующего выражения, соответственно.

Лучше

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 || \
{ echo "Sorry you are Offline" && exit 1; }

Вы можете использовать неравное сравнение -ne вместо -eq:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; 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"

отлично работает Это не относится к $? специальный параметр, хотя.

Далее, так как (( ... )) оценивает ненулевые значения как истинные, т. е. имеет статус возврата 0 для ненулевых значений и статус возврата 1, в противном случае мы можем сократить до

if (( $? )); then

но это может сбить с толку больше людей, чем стоит сэкономленное нажатие клавиш.

(( ... )) Конструкция доступна в Bash, но не требуется спецификацией оболочки POSIX (хотя упоминается как возможное расширение).

Это все, как говорится, лучше избегать $? в целом, на мой взгляд, как в ответе Коула, так и в ответе Стивена.

Другие вопросы по тегам