do
case $Option in
a ) # Действия, предусмотренные опцией 'a'.
b ) # Действия, предусмотренные опцией 'b'.
...
e) # Действия, предусмотренные опцией 'e', а так же необходимо обработать $OPTARG,
# в которой находится дополнительный аргумент этой опции.
...
g ) # Действия, предусмотренные опцией 'g'.
esac
done
shift $(($OPTIND - 1))
# Перейти к следующей опции.
# Все не так сложно, как может показаться ;-)
Пример 11-17. Прием опций/аргументов, передаваемых сценарию, с помощью getopts
#!/bin/bash
# ex33.sh
# Обработка опций командной строки с помощью 'getopts'.
# Попробуйте вызвать этот сценарий как:
# 'scriptname -mn'
# 'scriptname -oq qOption' (qOption может быть любой произвольной строкой.)
# 'scriptname -qXXX -r'
#
# 'scriptname -qr' - Неожиданный результат: "r" будет воспринят как дополнительный аргумент опции "q"
# 'scriptname -q -r' - То же самое, что и выше
# Если опция ожидает дополнительный аргумент ("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"
# Вывод аргумента с подавлением символа перевода строки.
echo -n " "
# Вставить пробел, для разделения выводимых аргументов.
shift
# Переход к следующему аргументу.
done
echo
return 0
}
Сценарий может подключить даже самого себя, только этому едва ли можно найти какое либо практическое применение.
Пример 11-19. Пример (бесполезный) сценария, который подключает себя самого.
#!/bin/bash
# self-source.sh: сценарий, который рекурсивно подключает себя самого."
Читать дальше