Отменить, если условие в bash script

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

лучше

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

Ответ 3

Если вы чувствуете себя ленивым, здесь приведен краткий метод обработки условий с использованием || (или) и && (и) после операции:

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

Ответ 4

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

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

Ответ 5

Поскольку вы сравниваете числа, вы можете использовать арифметическое выражение, которое позволяет упростить обработку параметров и сравнение:

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"

работает отлично. Однако это не относится к специальному параметру $?.

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

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