Ответ 1
Вы хотите использовать 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 \
-- "[email protected]")
# 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
определяет список коротких опций (:
после того, как опция указывает необходимый аргумент), а --long
указывает список длинных параметров (соответствующих для коротких опций).
Остальное - просто простой переключатель, вызывающий shift
соответствующим образом для продвижения указателя аргумента. Обратите внимание, что вызов shift; shift;
- это просто умственная привычка. В современном мире shift 2
, вероятно, будет достаточным.
Современный getopt довольно последователен для новых платформ, однако вы можете столкнуться с некоторыми проблемами с переносимостью в старых (около prehat Redhat 9) системах. См. man getopt
для получения информации о обратной совместимости. Однако вряд ли вы столкнетесь с необходимостью.
Наконец, после разбора параметров вы можете еще раз вызвать:
eval set -- "[email protected]"
Это приведет к перемещению указателя аргументов ко всему остальному, оставленному в командной строке после того, как getopt был обработан параметрами. Затем вы можете просто shift
продолжать читать их. Например, если команда выглядела так:
./foo --option bar file1.txt file2.txt file3.txt
Не забудьте сделать удобный -h / --help
вариант для печати ваших новых причудливых опций, как только вы закончите.:) Если вы сделаете этот вывод help2man дружественным, у вас есть страница быстрого доступа, чтобы перейти с новым инструментом.
Edit
В большинстве дистрибутивов вы можете найти более пример кода getopt
в /usr/share/doc/util-linux/examples
, который должен был быть установлен по умолчанию.