Существует много вопросов об этом виде вещи, но позволяет, предполагают, что мы нацелены на универсальную систему Linux и с getopt и с установленным getopts (не, что мы будем использовать также, но они кажутся популярными),
Как я анализирую обоих долго (-пример | - простую опцию в качестве примера) и короткий argruments (-e | - esimple-пример |-e простой пример)
Вы хотите использовать ] getopt
с длинными и короткими параметрами. Пример из рабочего кода:
# Parse arguments
TEMP=$(getopt -n $PROGRAM_NAME -o p:P:cCkhnvVS \
--long domain-password:,pop3-password:\
,create,cron,kill,help,no-sync-passwords,version,verbose,skip-pop3 \
-- "$@")
# Die if they fat finger arguments, this program will be run as root
[ $? = 0 ] || die "Error parsing arguments. Try $PROGRAM_NAME --help"
eval set -- "$TEMP"
while true; do
case $1 in
-c|--create)
MODE="CREATE"; shift; continue
;;
-C|--cron)
MODE="CRON"; shift; continue
;;
-k|--kill)
MODE="KILL"; shift; continue
;;
-h|--help)
usage
exit 0
;;
-n|--no-sync-passwords)
SYNC_VHOST=0; shift; continue
;;
-p|--domain-password)
DOMAIN_PASS="$2"; shift; shift; continue
;;
-P|--pop3-password)
POP3_PASS="$2"; shift; shift; continue
;;
-v|--version)
printf "%s, version %s\n" "$PROGRAM_NAME" "$PROGRAM_VERSION"
exit 0
;;
-v|--verbose)
VERBOSE=1; shift; continue
;;
-S|--skip-pop3)
SKIP_POP=1; shift; continue
;;
--)
# no more arguments to parse
break
;;
*)
printf "Unknown option %s\n" "$1"
exit 1
;;
esac
done
Обратите внимание, die
- это функция, которая была определена ранее (не показана).
-n Параметр
указывает getopt сообщать об ошибках как имя моей программы, а не как getopt
. -o
определяет список коротких параметров (:
после option указывает на необходимый аргумент), а - long
указывает список длинных опций (соответствующих в порядке коротких опций).
Остальное - просто простой переключатель, вызывающий shift
соответствующим образом, чтобы переместить указатель аргумента. Обратите внимание, что вызов shift; shift;
- это просто упорная привычка. В современном мире shift 2
наверное, хватит.
Современный getopt довольно согласован с новыми платформами, однако вы можете столкнуться с некоторыми проблемами переносимости на старых (примерно до Redhat 9) системах. См. man getopt
для получения информации об обратной совместимости. Однако вряд ли вам это понадобится.
Наконец, после синтаксического анализа параметров, вы можете снова вызвать:
eval set -- "$@"
Это переместит указатель аргумента на все остальное, что осталось в командной строке после того, как getopt завершил синтаксический анализ параметров. Затем вы можете просто сдвинуть
, чтобы продолжить их чтение.Например, если команда выглядела так:
./foo --option bar file1.txt file2.txt file3.txt
Не забудьте сделать удобную опцию -h / --help
, чтобы напечатать ваши новые причудливые опции, когда вы закончите. :) Если вы сделаете этот вывод help2man дружелюбным, у вас будет мгновенная страница руководства для вашего нового инструмента.
Изменить
В большинстве дистрибутивов вы можете найти дополнительный пример кода getopt
в / usr / share / doc / util-linux / examples
, который должен был быть установлен дефолт.