Используя составные условия в bash оболочке script

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

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

Ответы

Ответ 1

Для цифрового сравнения вы можете:

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

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

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

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

Это, например, выполняет команду 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)), как описано выше.

Ответ 2

if [ "$a" != "$b" -o "$a" != "$c" ]; then
  # ...
else
  # ...
fi

Ответ 3

#!/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

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