Условные утверждения 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 .

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

  • Написание сценария, который показывает, сколько строк имеет «X» и «Y» в нем?
  • Переключить пользователя в сценарий оболочки без ввода пароля
  • Найти весь интерфейс Ethernet и связать IP-адрес
  • Сценарии конфигурации VMware: могу ли я использовать PowerCLI?
  • Если выражение с двумя переменными - Bash
  • Bash Script для сортировки файлов в алфавитные папки на ReadyNAS Duo v1
  • Распечатывать список файлов меньше указанного размера файла
  • Инвертировать логическую переменную
  • Сценарий Bash не может перемещать файлы
  • Как скопировать чужие папки с public.me.com с помощью wget-подобного инструмента?
  • Rsync ведет себя по-другому, если вызывается внутри скрипта
  • Interesting Posts

    Добавить ArchLinux в Ubuntu с двойной загрузкой

    Как легко узнать, смонтировано ли какое-либо блочное устройство (или его часть)

    Компиляция программного обеспечения с теми же параметрами, что и предыдущая установка

    Почему не работает dzen2 при вызове через?

    Исправление соответствия шаблонов для сценария оболочки

    «Ошибка: неизвестная файловая система» после установки с ошибкой update-grub в UEFI

    Удаление строк в именах файлов

    Драйвер Linux не работает должным образом, когда скомпилирован в ядро

    Скрипт, чтобы определить, являются ли файлы изображениями

    Есть ли журнал ошибок для процесса, который читает файл sudoers?

    Почему некоторые опции недоступны

    Ключ удаления не работает должным образом в интерактивной оболочке PHP

    Получение пустых данных при чтении текстового файла и отправка данных чтения в url cURL в linux

    Разделение большого дерева каталогов на куски определенного размера?

    Запись разрешений внутри сценария оболочки

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