>args='getopt ab: $*'
>if [$?!= 0]
>then
>echo "Usage; command [-a] [-b file.txt] file1 file2…"
>exit -1
>fi
>set — $args
>for i
>do
>case "$i"
>in
>-a)
>FLAGA=1
>shift
>;;
>-b)
>ITEMB="$2"; shift
>shift
>;;
>-)
>shift; break
>;;
>esac
>done
Предполагается, что есть некая команда с флагами — а и — b. Второй флаг особый, потому что за ним должен следовать аргумент, например — b file.txt. Из первой строчки понятно, что за командой getopt следуют буквы, которые могут быть флагами. После флага, которому требуется дополнительный аргумент, стоит двоеточие. Далее мы видим оператор case (выбор) для каждого возможного аргумента. Код оператора либо устанавливает флаг, либо устанавливает флаг и сохраняет аргумент.
А что такое $2? И какой смысл в — )? И что делает set? И как поживает Наоми? Все это вы сможете узнать потом. А сейчас воспользуйтесь образцом, и он будет работать.
(Ну ладно. Если вы вправду хотите в этом разобраться, прочитайте «Advanced Bash-Scripting Guide» (Расширенное руководство по написанию скриптов bash) по адресу http://www.tldp.org/LDP/abs/html.)
Теперь я приведу более развернутый пример, иллюстрирующий некоторые дополнительные возможности. Во-первых, в нем определяется функция usage, предназначенная для вывода справочной информации. Интересная особенность этой функции — команда echo, растянутая на несколько строк. Неплохо, не так ли? bash не возражает. Во-вторых, в этом сценарии проверяется наличие минимального количества (MINITEMS) элементов командной строки после обработки аргументов. Наконец, сценарий демонстрирует обработку флагов, переопределяющих умолчания.
Пожалуйста, пользуйтесь этим кодом, если вам понадобится преобразовать простой сценарий в сценарий, обрабатывающий параметры и флаги:
>#!/bin/bash
>MINITEMS=1
>function usage
>{
>echo "
>Usage: $0 [-d] [-a author] [-c file.txt] [-h] dir1 [dir1…]
>-d debug, don't actual run command
>-a author name of the author
>-c copyright override default copyright file
>-h this help message
>"
>exit 1
>}
># Задание умолчаний:
>DEBUG=false
>DEBUGCMD=
>AUTHOR=
>COPYRIGHT=copyright.txt
># Обработка аргументов командной строки
># с возможным переопределением умолчаний
>args='getopt da: c:h $*'
>if [$?!= 0]
>then
>usage
>fi
>set — $args
>for i
>do
>case "$i"
>in
>-h)
>usage
>shift
>;;
>-a)
>AUTHOR="$2"; shift
>shift
>;;
>-c)
>COPYRIGHT="$2"; shift
>shift
>;;
>-d)
>DEBUG=true
>shift
>;;
>-)
>shift; break;;
>esac
>done
>if $DEBUG; then
>echo DEBUG MODE ENABLED.
>DEBUGCMD=echo
>fi
># Проверка наличия минимального количества элементов
># командной строки
>if $DEBUG; then echo ITEM COUNT = $#; fi
>if [$# — lt "$MINITEMS"]; then
>usage
>fi
># Если первый аргумент особый, запомнить его: