использование составных условий в сценарии оболочки bash - PullRequest
14 голосов
/ 27 января 2011

Я хочу сделать что-то вроде ниже в скрипте bash. Как мне реализовать в синтаксисе Bash.

if !((a==b) && (a==c))
then 
do something
end if

Ответы [ 3 ]

27 голосов
/ 27 января 2011

Для числового сравнения вы можете сделать:

if ! (( (a == b) && (a == c) ))

Для сравнения строк:

if ! [[ "$a" == "$b" && "$a" == "$c" ]]

В Bash двойные скобки задают арифметический контекст (в котором знаки долларакстати, по большей части необязательный) для сравнения (также используется в арифметическом расширении for ((i=0; i<=10; i++)) и $(())) и используется для различения последовательности от набора одиночных скобок, который создает подоболочку.

This,например, выполняет команду true и, поскольку она всегда верна, она выполняет действие:

if (true); then echo hi; fi 

Это то же самое, что и

if true; then echo hi; fi

, за исключением того, что создается подоболочка.Тем не менее, if ((true)) проверяет значение переменной с именем "true".

Если бы вы включили знак доллара, то "$ true" было бы однозначно переменной, но поведение if с одиночнымкруглые скобки (или без скобок) изменились бы.

if ($true)

или

if $true

выполнит содержимое переменной как команду и выполнит условное действие на основе значения команды выхода (или выдаст сообщение «команда не найдена»)если содержимое не является допустимой командой).

if (($true)) 

делает то же самое, что и if ((true)), как описано выше.

4 голосов
/ 27 января 2011
if [ "$a" != "$b" -o "$a" != "$c" ]; then
  # ...
else
  # ...
fi
2 голосов
/ 27 января 2011
#!/bin/bash

a=2
b=3
c=4

if ! (( (a == b) && (a == c) )); then  
  # stuff here
fi

Вы также можете использовать следующее, что лично мне кажется более понятным:

#!/bin/bash

a=2
b=3
c=4

if (( (a != b) || (a != c) )); then  
  # stuff here
fi

Технически говоря, вам не нужны парены вокруг подвыражений, поскольку операторы равенства == != имеют более высокий приоритет, чем оба оператора сравнения составных чисел && ||, но я думаю, что было бы разумно держать их там, чтобы показать намерение, если ничего остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...