2016-06-01 6 views
0

У меня есть следующий кодAND, OR условия, если заявление

elif [ $text2 == 'LANDING' ] && [ "$text4" == 'FAIL' ] || [ "$text4" == '' ]; then 

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

Пожалуйста, помогите, если Im делать какие-то ошибки Заранее спасибо

ответ

1

Вы должны сгруппировать их в явном виде:

elif [ "$text2" = 'LANDING' ] && 
     { [ "$text4" = 'FAIL' ] || [ "$text4" = '' ]; }; then 

Ваша попытка будет преуспеть в любом из двух следующих условий:

  1. text2 было ПОЗДРАВЛЕНИЕ иtext4 был FAIL
  2. text4 был пуст или не установлен.

С && и || имеют одинаковый приоритет, вы могли бы (как это ни удивительно) писать без группировки:

elif [ "$text4" = '' ] || [ "$text4" = FAIL ] && [ $text2 == 'LANDING' ]; then 

Если вы используете bash, вы можете использовать команду [[ ... ]] вместо [ ... ]. Требуется группировка; операторы внутри [[ ... ]]do имеют приоритеты, которых вы ожидаете ожидать на других языках (то есть a || b && c - a || (b && c), а не (a || b) && c).

elif [[ $text2 == 'LANDING' && ("$text4" == 'FAIL' || "$text4" == '') ]]; then 
0

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

elif [ $text2 == 'LANDING' ] && { [ "$text4" == 'FAIL' ] || [ "$text4" == '' ]; }; then 

Обратите внимание, что в фигурных скобках требуется дополнительная точка с запятой.

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

elif [[ $text2 == 'LANDING' && ("$text4" == 'FAIL' || "$text4" == '') ]]; then 
1

Не особенно рекомендуется, но с Баш, вы можете использовать расширенный универсализации модели в [[...]]

elif [[ $text2 == 'LANDING' && $text4 == @(FAIL|) ]]; then 
Смежные вопросы