Подтвердить что ты не робот

Булевы операторы Unix (&&, -a, ||, -o)

Может кто-нибудь объяснить разницу между операторами & &, ||, -a и -o Unix?

Каковы ограничения на использование обоих типов?

Это просто, что && и || операторы должны использоваться при использовании флагов в условии?

Как в: [ "$ 1" = "yes" ] && & && [-r $2.txt]

в зависимости от: [ "$ 1" = "yes" -a $2 -lt 3]

4b9b3361

Ответ 1

Правило большого пальца: Используйте -a и -o внутри квадратных скобок, && и || снаружи.

Важно понимать разницу между синтаксисом оболочки и синтаксисом команды [.

  • && и || - операторы оболочки. Они используются для объединения результатов двух команд. Поскольку они являются синтаксисом оболочки, они имеют особое синтаксическое значение и не могут использоваться в качестве аргументов для команд.

  • [ не является специальным синтаксисом. Это фактически команда с именем [, также известное как test. Поскольку [ является просто регулярной командой, она использует -a и -o для своих и/или операторов. Он не может использовать && и ||, потому что это синтаксис оболочки, который команды не видят.

Но подождите! Bash имеет синтаксис синтаксического анализа в форме [[ ]]. Если вы используете двойные квадратные скобки, вы получаете доступ к вещам типа регулярных выражений и подстановочных знаков. Вы также можете использовать операторы оболочки, такие как &&, ||, < и > свободно внутри скобок, потому что, в отличие от [, двойная скобка представляет собой специальный синтаксис оболочки. Bash анализирует [[, поэтому вы можете писать такие вещи, как [[ $foo == 5 && $bar == 6 ]].

Ответ 2

-a и -o - старшие и/или операторы для команды test. & & и || являются и/или операторами оболочки. Итак, (в предположении старой оболочки) в вашем первом случае,

[ "$1" = 'yes' ] && [ -r $2.txt ]

Оболочка оценивает и условие. В вашем втором случае

[ "$1" = 'yes' -a $2 -lt 3 ]

Команда test (или встроенный тест) оценивает и условие.

Конечно, во всех современных или полусовременных оболочках тестовая команда встроена в оболочку, поэтому на самом деле нет никакой или большой разницы. В современных оболочках оператор if может быть записан:

[[ $1 == yes && -r $2.txt ]]

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