Условные списки команд представляют собой компактные, но достаточно выразительные конструкции, управляющие ходом выполнения сценария.
Как указывалось в статье о подстановке параметров, каждая команда имеет статус завершения:— нулевой при успешном выполнении и отличный от нуля при неуспешном.
Условный список «И» формируется конструкцией вида command1 && command2 && … и выполняет команды последовательно, запуская очередную команду, только если предыдущая закончилась успешно (заканчивая свое выполнение после первой неуспешной команды).
Условный список «ИЛИ» вида comand1 || connand2 || …, наоборот, очередную команду запускает только в случае неуспеха предыдущей (заканчивая свое выполнение после первой успешно выполнившейся команды).
В примере из листинга ниже безусловная попытка смонтировать ISO-образ диска неуспешна, потому что эта операция уже была выполнена ранее.
Условный список «ИЛИ» организует проверку «смонтированности» файловой системы в указанный каталог.
Если первая команда списка findmnt завершится неуспехом (если никакая файловая система в указанный каталог не смонтирована), то в этом случае будет запущена команда монтирования fuseiso. В противном случае, результатом успешно выполнившейся команды findmnt будет вывод информации о файловой системе, уже смонтированной в целевой каталог.
Список «ИЛИ»
bender@ubuntu:~$ fuseiso dvd.iso ~/.dvd
fuse: pcuntpolnt Is not empty
fuse: if you are sure this is safe, use the ‘nonempty’ mount option
bender@ubuntu:~$ set -x
bender@ubuntu:~$ findmnt ~/.dvd || fuseiso dvd.iso ~/.dvd
+ findmnt /home/bender/.dvd
TARGET SOURCE FSTYPE OPTIONS
/home/bender/.dvd fuseiso fuse.fus rw,nosuid,nodev,relatime,user_id=1008, group_id=1010
Условный список «И» в примере из листинга ниже, наоборот, пытается размонтировать файловую систему, только если она была смонтирована ранее.
Список «И»
bender@ubuntu:~$ fusemount -u ~/.dvd
fuse mount: entry for /home/bender/.dvd not found in /etc/mtab
bender@ubuntu:~$ set -x
bender@ubuntu:~$ findmnt ~/.dvd && fusemount -u ~/.dvd
+ findmnt /home/bender/.dvd
Условные списки можно комбинировать, найример, в видеУсловные списки можно комбинировать, например, в виде command1 && command2 || command3 … или conmand1 || command2 && command3.
Сначала будет выполнена первая команда и начнется анализ ее статуса завершения по условиям списка. Если после команды указано условие «И» &&, то при ее успешном завершении будет выполнена следующая команда, а при неуспешном анализ продолжится на следующем условии и т. д.
И наоборот, если после команды указано условие «ИЛИ», то при ее неуспешном завершении будет выполнена следующая команда, а при успешном анализ продолжится на следующем условии. Как только будет найдена очередная команда для выполнения, она будет выполнена и начнется анализ ее статуса выполнения по условиям списка, следующим за ней.
Так, например, в листинге ниже комбинированный список «ИЛИ-И» всегда приводит к выводу списка файлов из каталога, куда смонтирован ISO-образ, вне зависимости от того, был ли он туда смонтирован до запуска списка или был смонтирован командами при его выполнении.
Комбинация списков «И» и «ИЛИ»
bender@ubuntu:~$ set -x
bender@ubuntu:~$ findmt ~/.dvd || fusetso dvd.iso ~/.dvd && ls -a ~/.dvd
+ findmt /home/bender/.dvd + fuseiso dvd.iso /home/bender/.dvd
+ ls —color=auto -a /home/bender/.dvd
. acme bootdisk.ing env LICENSE.afpl mips pbsraw sparc
.. adm cfg fd LICENSE.gpl mnt power sys
386 amd64 cron lib lp n power64 tmp
9load arm dist LICENSE mail NOTICE rc usr
bender@ubuntu:~$ findmt ~/.dvd || fuseiso dvd.iso ~/.dvd && ls -a ~/.dvd
+ ftndnnt /hone/bender/.dvd
TARGET SOURCE FSTYPE OPTIONS
/home/bender/.dvd fuseiso fuse.fus rw,nosuid,nodev,relatime,user_id=1008,group_i
+ ls —color=auto -a /home/bender/.dvd
. acme bootdisk.ing env LICENSE.afpl mips pbsraw sparc
.. adm cfg fd LICENSE.gpl mnt power sys
386 amd64 cron lib lp n power64 tmp
9load arm dist LICENSE mail NOTICE rc usr