Условные утверждения Bash

Каковы три формата условных операторов, используемых в сценариях bash?

One Solution collect form web for “Условные утверждения Bash”

В соответствующем разделе руководства bash перечислены 5 различных конструкций, которые могут использоваться для условной оценки. Из них конструкции if , case и [[ .. ]] , вероятно, наиболее часто используются в коде реального мира, хотя конструкция (( .. )) будет часто использоваться в скриптах, которые выполняют сложный подсчет или другие численные операции.

Но они не упоминают другую очень распространенную форму, используемую для ветвления в bash, которая заключается в том, чтобы просто выполнить команду в сочетании с оценкой короткого замыкания, например

 grep -q needle haystack.txt && echo "Needle located!" || echo "No dice or needles."; 

&& и || являются логическими операторами: «и» и «или» соответственно.

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

 if grep -q needle haystack.txt; then echo "yea"; else echo "nay"; fi; 

но работает по-другому: в первом виде условная логика действительно возникает как побочный эффект фактической явной цели кода, который, по крайней мере, якобы, должен оценивать логические операторы. Такая конструкция также часто встречается в C и JavaScript-коде.

Он работает, используя ярлыки: части выражения, например x && y || z x && y || z , оцениваются слева направо. Если левая часть логического и, например, x в x && y , оценивается как false, bash не оценивает оценку y части, потому что в этой точке он уже знает, что x && y является ложным.

Обратное верно для логических ors: true || z true || z всегда оценивает значение true, независимо от того, что z оказывается.

Поэтому, если grep выходит false, bash может пропустить это первое echo , потому что эта часть выражения не может быть правдой. Таким образом, он переходит к второму echo . С другой стороны, если grep истинно, выполняется первое echo (в результате эти слова будут, ну, эхом.). В этот момент bash выполняется, потому что независимо от значения правой части || , результат выражения будет по-прежнему истинным.

Чтобы понять, как bash работает с условными выражениями, лучше всего провести некоторое экспериментирование в командной строке. Команда

 echo $?; 

будет эхо- код возврата предыдущего оператора. Это код ошибки, поэтому 0 означает true, а ненулевое значение означает false. Сначала это немного запутывает, но вы привыкаете к этому.

Так вы можете сделать, например

 $ (( 1 + 2 == 3 )); echo $? 0 $ (( 1 + 2 == 4 )); echo $? 1 

и выполните аналогичные тесты с конструкцией [[ .. ]] чтобы понять эти основные строительные блоки. После того, как вы это сделаете, перейдите к операторам if и then case .

Что касается ответа на ваш вопрос, я думаю, что это очень зависит от контекста, в котором он был задан. Но чтобы получить хорошее представление о различных вариантах, вы должны понять, что они там ищут.

  • Как создать последовательно пронумерованные имена файлов в bash?
  • bash: как вы возвращаете расширения файлов?
  • Шаблон KSH из переменной не работает
  • Специфика использования переменной BASH и условного IF
  • Как передать переменные среды в неинтерактивную оболочку (с примером)?
  • Как увидеть интерактивный вывод при запуске nmap из сценария bash?
  • проблема сценария оболочки с использованием операторов
  • Задача Cron в графическом интерфейсе
  • Проверка состояния настраиваемых служб со сценарием
  • Использование Grep In For Loop
  • Как изменить вывод скрипта bash при запуске скрипта?
  • Interesting Posts

    Как можно выполнить команду с неизвестным числом аргументов в оболочке POSIX?

    Какая лучшая книга для изучения системного программирования Linux?

    Были ли все команды Unix переписаны в Linux?

    использование tee для вывода промежуточных результатов в stdout вместо файлов

    Chromium не отображает Flash в Debian Wheezy

    OpenVPN: защитить ваш клиентский ключ / cert / conf от кражи?

    Почему ОС установлена ​​на флэш-накопителе USB намного медленнее, чем операционная ОС, работающая на одном и том же флэш-диске?

    скопировать + вставить между рабочим столом Linux и vmware?

    Окно просмотра Tmux, вызванное несколькими параллельными сеансами

    Как исправить ошибку ссылки в CMake для класса QX11Info на Mac OS X

    NOEXEC и RESTRICT в судерах

    чистые сценарии пытаются восстановить старый физический удаленный сетевой интерфейс

    удалить часть строки, содержащуюся в двух разных типах разделителей / разделителей

    Как переопределить DNS-сервер в nat-шлюзе (iptables)

    Соединение AWS ubuntu Connection отказано

    Linux и Unix - лучшая ОС в мире.