Условные списки командного интерпретатора Linux

Условные списки команд представляют собой компактные, но достаточно выразительные конструкции, управляющие ходом выполнения сценария.

Как указывалось в статье о подстановке параметров, каждая команда имеет статус завершения:— нулевой при успешном выполнении и отличный от нуля при неуспешном.

Условный список «И» формируется конструкцией вида 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

Добавить комментарий