# Если опция ожидает дополнительный аргумент ("flag:"), то следующий параметр
# в командной строке, будет воспринят как дополнительный аргумент этой опции.
NO_ARGS=0
E_OPTERROR=65
if [ $# -eq "$NO_ARGS" ] # Сценарий вызван без аргументов?
then
echo "Порядок использования: `basename $0` options (-mnopqrs)"
exit $E_OPTERROR # Если аргументы отсутствуют -- выход с сообщением
# о порядке использования скрипта
fi
# Порядок использования: scriptname -options
# Обратите внимание: дефис (-) обязателен
while getopts ":mnopq:rs" Option
do
echo $OPTIND
case $Option in
m ) echo "Сценарий #1: ключ -m-";;
n | o ) echo "Сценарий #2: ключ -$Option-";;
p ) echo "Сценарий #3: ключ -p-";;
q ) echo "Сценарий #4: ключ -q-, с аргументом \"$OPTARG\"";;
# Обратите внимание: с ключом 'q' должен передаваться дополнительный аргумент,
# в противном случае отработает выбор "по-умолчанию".
r | s ) echo "Сценарий #5: ключ -$Option-"'';;
* ) echo "Выбран недопустимый ключ.";; # ПО-УМОЛЧАНИЮ
esac
done
shift $(($OPTIND - 1))
# Переход к очередному параметру командной строки.
exit 0
Управление сценарием
source, . (точка)
Когда эта команда вызывается из командной строки, то это приводит к запуску указанного сценария. Внутри сценария, команда source file-name загружает файл file-name. Таким образом она очень напоминает директиву препроцессора языка C/C++ -- "#include". Может найти применение в ситуациях, когда несколько сценариев пользуются одним файлом с данными или библиотекой функций.
Пример 11-18. "Подключение" внешнего файла
#!/bin/bash
. data-file # Загрузка файла с данными.
# Тот же эффект дает "source data-file", но этот вариант более переносим.
# Файл "data-file" должен находиться в текущем каталоге,
#+ т.к. путь к нему не указан.
# Теперь, выведем некоторые переменные из этого файла.
echo "variable1 (из data-file) = $variable1"
echo "variable3 (из data-file) = $variable3"
let "sum = $variable2 + $variable4"
echo "Сумма variable2 + variable4 (из data-file) = $sum"
echo "message1 (из data-file): \"$message1\""
# Обратите внимание: кавычки экранированы
print_message Вызвана функция вывода сообщений, находящаяся в data-file.
exit 0
Файл data-file для Пример 11-18, представленного выше, должен находиться в том же каталоге.
# Этот файл подключается к сценарию.
# Подключаемые файлы могут содержать об"явления переменных, функций и т.п.
# Загружаться может командой 'source' или '.' .
# Инициализация некоторых переменных.
variable1=22
variable2=474
variable3=5
variable4=97
message1="Привет! Как поживаете?"
message2="Досвидания!"
print_message ()
{
# Вывод сообщения переданного в эту функцию.
if [ -z "$1" ]
then
return 1
# Ошибка, если аргумент отсутствует.
fi
echo
until [ -z "$1" ]
do
# Цикл по всем аргументам функции.
echo -n "$1"