Простые логические операторы в Bash

У меня есть пара переменных, и я хочу проверить следующее условие (записано в словах, а затем моя неудачная попытка создания сценариев bash):

if varA EQUALS 1 AND ( varB EQUALS "t1" OR varB EQUALS "t2" ) then do something done. 

И в моей неудачной попытке я придумал:

 if (($varA == 1)) && ( (($varB == "t1")) || (($varC == "t2")) ); then scale=0.05 fi 

То, что вы написали, фактически почти работает (оно будет работать, если все переменные будут числами), но это вовсе не идиоматический способ.

  • (…) круглые скобки обозначают подоболочку . То, что внутри них, не является выражением, как на многих других языках. Это список команд (как и вне круглых скобок). Эти команды выполняются в отдельном subprocessе, поэтому любое переадресация, назначение и т. Д., Выполненные внутри круглых скобок, не имеют эффекта вне круглых скобок.
    • При знаке доллара в долларах $(…) является подстановкой команд : в скобках есть команда, а вывод из команды используется как часть командной строки (после дополнительных расширений, если подстановка не находится между двойными кавычками, но это еще одна история ).
  • { … } скобки подобны скобкам, поскольку они группируют команды, но они влияют только на парсинг, а не на группировку. Программа x=2; { x=4; }; echo $x x=2; { x=4; }; echo $x x=2; { x=4; }; echo $x печатает 4, тогда как x=2; (x=4); echo $x x=2; (x=4); echo $x x=2; (x=4); echo $x prints 2. (Также скобки требуют пространства вокруг них и точки с запятой перед закрытием, тогда как в скобках нет. Это просто синтаксический приступ.)
    • При знаке доллара, ${VAR} – это расширение параметра , расширяющееся до значения переменной с возможными дополнительными преобразованиями.
  • ((…)) двойные круглые скобки окружают арифметическую инструкцию , то есть вычисление на целые числа, с синтаксисом, напоминающим другие языки программирования. Этот синтаксис в основном используется для присвоений и в условных выражениях.
    • Тот же синтаксис используется в арифметических выражениях $((…)) , которые расширяются до целочисленного значения выражения.
  • [[ … ]] двойные скобки окружают условные выражения . Условные выражения в основном построены на операторах, таких как -n $variable чтобы проверить, является ли пустая переменная и -e $file проверять, существует ли файл. Существуют также операторы равенства строк: "$string1" = "$string2" (остерегайтесь, что правая часть является шаблоном, например [[ $foo = a* ]] если $foo начинается с while [[ $foo = "a*" ]] если $foo точно a* ) и знакомый ! , && и || операторы для отрицания, соединения и дизъюнкции, а также круглые скобки для группировки. Обратите внимание, что вам нужно пространство вокруг каждого оператора (например, [[ "$x" = "$y" ]] , а не [[ "$x"="$y" ]] ) и пробел или символ ; как внутри, так и снаружи скобок (например, [[ -n $foo ]] , а не [[-n $foo]] ).
  • [ … ] отдельные скобки являются альтернативной формой условных выражений с большим количеством причуд (но более старых и более переносимых). На данный момент не пишите; начните беспокоиться о них, когда найдете скрипты, которые их содержат.

Это идиоматический способ написать свой тест в bash:

 if [[ $varA = 1 && ($varB = "t1" || $varC = "t2") ]]; then 

Если вам нужна переносимость для других оболочек, это будет так (обратите внимание на дополнительное цитирование и отдельные группы скобок вокруг каждого отдельного теста):

 if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then 

очень близко

 if [[ $varA -eq 1 ]] && [[ $varB == 't1' || $varC == 't2' ]]; then scale=0.05 fi 

должно сработать.

разрушение

 [[ $varA -eq 1 ]] 

представляет собой целочисленное сравнение, где as

 $varB == 't1' 

это сравнение строк. в противном случае я просто правильно группирую сравнения.

Двойные квадратные скобки ограничивают условное выражение. И я считаю следующее хорошее чтение по этому вопросу: «(IBM) Demystify test, [, [[, ((, и if-then-else)

Очень портативная версия (даже для старой оболочки bourne):

 if [ "$varA" = 1 -a \( "$varB" = "t1" -o "$varB" = "t2" \) ] then do-something fi 

У этого есть дополнительное качество работы только одного subprocessа максимум (который является процессом ‘[‘), независимо от вкуса оболочки.

Замените «=» на «-eq», если переменные содержат числовые значения, например

  • 3 -экв 03 истинно, но
  • 3 = 03 – false. (сравнение строк)
 if ([ $NUM1 == 1 ] || [ $NUM2 == 1 ]) && [ -z "$STR" ] then echo STR is empty but should have a value. fi 

Вот код короткой версии инструкции if-then-else:

 ( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok" 

Обратите внимание на следующее:

  1. || и && операнды внутри, если условие (т.е. между круглыми скобками) являются логическими операндами (или / и)

  2. || и && операнды снаружи, если условие означает then / else

Практически в заявлении говорится:

если (a = 1 или b = 2), то «ok» else «nok»

  • Булевы операторы && и ||
  • Логические операторы в C
  • Письменные версии логических операторов
  • Являются ли закодированные логические операторы короткими законами? И порядок оценки?
  • Короткое замыкание логического оператора Java
  • Различия в булевых операторах: & vs && и | vs ||
  • Interesting Posts

    Явная память Java (SUN JVM)

    Поиск последовательной битовой строки 1 или 0

    Как я могу сделать Notepad ++ запоминать все экземпляры себя из последнего сеанса?

    Реализуйте очередь, в которой push_rear (), pop_front () и get_min () – все операции с постоянным временем

    TortoiseGit с ключом openssh не аутентифицируется с использованием ssh-agent

    Добавление jQuery в PrimeFaces приводит к тому, что Uncaught TypeError по всему месту

    Как определить направление движения между левым / правым и вверх / вниз

    Почему «typdef struct {struct S * s; } S; “, содержащий указатель на компиляцию того же типа?

    Как поддерживать HTTP OPTIONS-глагол в приложении ASP.NET MVC / WebAPI

    Отключение автоматического форматирования в Visual Studio

    Signalr / Hub не загружается в IIS 7, но корректно работает в Visual Studio

    Помощь оптимизации цикла цикла для окончательного назначения

    Разница между CPPFLAGS и CXXFLAGS в GNU Make

    Как загрузить большое количество файлов через ubuntu

    c # возвращающая ошибка “не все пути кода возвращают значение”

    Давайте будем гением компьютера.