Условное исполнение команд
Операторы условного исполнения команд && и || могут быть применены для управления потоком исполнения команд. Они позволяют исполнять команды в зависимости от успешности выполнения предыдущих команд.
Если оператор && установлен между двумя командами, то вторая из них будет исполнена только в случае успеха предыдущей (пример 10.24).
Пример 10.24. Выполнение команды в случае успеха предыдущей команды |
$ ls /tmp &> /dev/null && cd /tmp
$ pwd
/tmp
В примере 10.24 первая команда проверяет наличие каталога, переход в ко- торый осуществляет вторая команда cd /tmp при условии успешного испол- нения первой.
Более изящный вариант выполнения этой же задачи заключается в использо- вании команды test для проверки существования целевого каталога (при- мер 10.25).
Пример 10.25. Использование команды test с условными операторами |
$ [ -d /tmp ] && cd /tmp
$ pwd
/tmp
Команда test в примере 10.25 проверяет существование каталога.
Если необходимо выполнять команду в случае неудачного завершения работы другой команды, удобно применять оператор ||. Например, требуется перейти в каталог d1. В случае отсутствия этот каталог необходимо создать и перейти в него. Эту задачу можно решить следующим образом (пример 10.26).
Пример 10.26. Выполнение команды при неудаче предыдущей команды |
$ [ -d d1 ] || mkdir d1 ; cd d1
$ pwd
/tmp/d1
Если каталог отсутствует (пример 10.26), то он создается.
Оболочка предоставляет также специальную команду if, которая позволяет управлять последовательностью исполнения целых блоков команд. В качест- ве примера предположим, что требуется обеспечить выход из некоторого сценария с ошибкой, если в командной строке установлено отличное от еди- ницы число аргументов командной строки. При этом команда должна сооб- щать об ошибке и выдавать подсказку о правильном варианте ее использова- ния (пример 10.27).
Пример 10.27. Команда if |
#!/bin/bash
if [ $# -ne 1 ] then
cat <<- ERR
Недостаточно аргументов. Использование:
if.sh file
Аргумент file должен быть обычным файлом.
fi
ls -l $1
ERR
exit 1
Команда if исполняет блок команд после команды then, только в случае по- лучения нулевого кода возврата команды, указанной в качестве ее аргумента. В данном случае аргумент команды if — это команда test, которая проверя- ет количество аргументов сценария. Если количество аргументов не равно единице, то выполняется блок операторов после then до команды fi, закан- чивающей if.
Конструкция cat <<- ERR — это "here document". Она позволяет указывать целый блок данных непосредственно в теле сценария, передавая его в данном случае в стандартный поток ввода команде cat для вывода на экран. Блок
данных ограничен строкой ERR. В этом примере используется оператор <<-
вместо << для игнорирования табуляций перед блоком данных. Результат — в примере 10.28.
Пример 10.28. Результаты работы программы с командой if |
$ ./if.sh
Недостаточно аргументов. Использование:
if.sh file
Аргумент file должен быть обычным файлом.
$ ./if.sh if.sh
-rwxr--r-- 1 user1 users 172 Oct 8 19:34 if.sh
Команда if допускает использование команды elif для выполнения допол- нительной проверки (пример 10.29).
Пример 10.29. Команда elif |
#!/bin/bash
if [ $# -ne 1 ] then
cat <<- ERR
Недостаточно аргументов. Использование:
if.sh file
Аргумент file должен быть обычным файлом.
ERR
exit 1 elif [ ! -f $1 ] then
fi
ls -l $1
echo -n 'Тип файла ' file $1
exit 1
Если аргументом задан специальный файл, то выводится его тип (при-
мер 10.30).
Пример 10.30. Проверка работы сценария с elif |
$ ./if.sh .
Тип файла .: directory
В команде if можно также использовать else для указания блока операто- ров, которые должны исполняться в случае, если предыдущие проверки не закончились успехом (пример 10.31).
Пример 10.31. Команда else |
#!/bin/bash
if [ $# -ne 1 ] then
cat <<- ERR
Недостаточно аргументов. Использование:
if.sh file
Аргумент file должен быть обычным файлом.
ERR
exit 1 elif [ ! -f $1 ] then
else fi
echo -n 'Тип файла ' file $1
exit 1 ls -l $1
Дата добавления: 2015-06-12; просмотров: 1046;