Отрицание условия if в сценарии bash

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

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

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

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

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

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

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

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"

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

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

if (( $? )); then

но это может запутать больше людей, чем нажатия клавиш, сохраненные стоят.

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

все это, как говорится, лучше избегать $? в целом по-моему, как в Коул!--12--> и Стивен.


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

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