Отрицание условия 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