Обо мне: C/C++/Linux эксперт. Говорим про разработку, Linux, DevOps, сети и администрирование.
Админ (реклама): @XoDefender
Чат: @linuxcamp_chat
Менеджер: @Spiral_Yuri
Биржа: https://telega.in/c/linuxcamp_tg
РКН: https://clck.ru/3RWA3C
Post #158
6.58K

Выполняй только то, что нужно! Условные списки Bash
Скорее всего, вы каждый день запускаете команды, которые зависят от выполнения предыдущих.
Механизм списков позволяет не только разом выполнить группу команд, но и выстроить условную последовательность через операторы "&& (И)" и "|| (ИЛИ)".
Условные списки
Предположим, вы хотите создать файл new.txt в каталоге dir. Типичная последовательность может быть следующей:
Запуск второй команды зависит от успешного выполнения первой. Если каталог не существует, то нет смысла и команду запускать.
Оболочка позволяет сделать эту зависимость явной, объединив команды оператором && (И):
Если вы используете систему контроля версий Git, то, вероятно, знакомы со следующей последовательностью команд фиксации и внесения изменений:
Если какая-либо из команд завершится ошибкой, остальные вы не запустите. Поэтому эта цепочка хорошо работает в формате условного списка.
Так же, как оператор && запускает вторую команду только в случае успеха первой, оператор || (ИЛИ) запускает вторую команду только в случае сбоя первой.
Например, следующая команда пытается войти в каталог и, если это не удается, создает его:
Вы часто будете видеть этот оператор в сценариях оболочки. В частности, для выхода в случае возникновения ошибки:
Операторы && и || можно использовать вместе, чтобы настраивать более сложные действия:
Последовательность предполагает попытку войти в каталог dir, если это не удается, создать каталог и войти в него, а если и это не удается, вывести ошибку.
Безусловные списки
Команды в списке не обязательно должны зависеть друг от друга. Если вы разделяете команды точкой с запятой, они просто выполняются по порядку.
Вот пример команды, которая спит течение двух часов, а затем создает резервную копию важных файлов:
Безусловные списки дают те же результаты, что и ввод команд по отдельности.
Единственное существенное различие - коды возврата. В таком списке коды отдельных команд отбрасываются, кроме последней.
Только код возврата последней команды в списке присваивается переменной оболочки "?":
LinuxCamp
Скорее всего, вы каждый день запускаете команды, которые зависят от выполнения предыдущих.
Механизм списков позволяет не только разом выполнить группу команд, но и выстроить условную последовательность через операторы "&& (И)" и "|| (ИЛИ)".
Условные списки
Предположим, вы хотите создать файл new.txt в каталоге dir. Типичная последовательность может быть следующей:
$ cd dir
$ touch new.txt
Запуск второй команды зависит от успешного выполнения первой. Если каталог не существует, то нет смысла и команду запускать.
Оболочка позволяет сделать эту зависимость явной, объединив команды оператором && (И):
$ cd dir && touch new.txt
Если вы используете систему контроля версий Git, то, вероятно, знакомы со следующей последовательностью команд фиксации и внесения изменений:
$ git add . && git commit -m"fixed a bug" && git push
Если какая-либо из команд завершится ошибкой, остальные вы не запустите. Поэтому эта цепочка хорошо работает в формате условного списка.
Так же, как оператор && запускает вторую команду только в случае успеха первой, оператор || (ИЛИ) запускает вторую команду только в случае сбоя первой.
Например, следующая команда пытается войти в каталог и, если это не удается, создает его:
$ cd dir || mkdir dir
Вы часто будете видеть этот оператор в сценариях оболочки. В частности, для выхода в случае возникновения ошибки:
cd dir || exit 1
Операторы && и || можно использовать вместе, чтобы настраивать более сложные действия:
$ cd dir || mkdir dir && cd dir || echo "I failed"
Последовательность предполагает попытку войти в каталог dir, если это не удается, создать каталог и войти в него, а если и это не удается, вывести ошибку.
Безусловные списки
Команды в списке не обязательно должны зависеть друг от друга. Если вы разделяете команды точкой с запятой, они просто выполняются по порядку.
Вот пример команды, которая спит течение двух часов, а затем создает резервную копию важных файлов:
$ sleep 7200; cp -a ~/files /mnt/backup_drive
Безусловные списки дают те же результаты, что и ввод команд по отдельности.
Единственное существенное различие - коды возврата. В таком списке коды отдельных команд отбрасываются, кроме последней.
Только код возврата последней команды в списке присваивается переменной оболочки "?":
$ mv file1 file2; mv file2 file3; mv file3 file4
# Код возврата команды «mv file3 file4»
$ echo $?
0
LinuxCamp
- 👍 40
- 🔥 10
- ❤🔥 7
- ❤ 1






