Отрицание, если условие в скрипте 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 (хотя упоминается как возможное расширение).
Это все, как говорится, лучше избегать $?
в целом, на мой взгляд, как в ответе Коула, так и в ответе Стивена.