Я хочу, чтобы с помощью моего скрипта оболочки вызывались длинные и короткие формы параметров командной строки.
Я знаю, что можно использовать getopts
, но, как и в Perl, я не смог сделать то же самое с shell.
Любые идеи о том, как это можно сделать, чтобы я мог использовать такие параметры, как:
./shell.sh --copyfile abc.pl /tmp/
./shell.sh -c abc.pl /tmp/
. В приведенном выше описании обе команды означают одно и то же для моей оболочки, но с использованием getopts
, Я не смог реализовать их?
Существует три реализации, которые можно рассмотреть:
Bash, встроенный getopts
. Это не поддерживает длинные имена опции с префиксом двойного тире. Это только поддерживает односимвольные опции.
реализация UNIX BSD автономных getopt
команда (который является тем, что MacOS использует). Это не поддерживает долгие опции также.
реализация GNU автономных getopt
. GNU getopt(3)
(используемый командной строкой getopt(1)
на Linux) поддержки, анализирующие долгие опции.
Некоторые другие ответы показывают решение для использования удара, встроенного getopts
для имитации долгих опций. То решение на самом деле делает короткую опцию, символ которой "-". Таким образом, Вы добираетесь "-" как флаг. Затем что-либо после этого становится OPTARG, и Вы тестируете OPTARG с вложенным case
.
Это умно, но это идет с протестами:
getopts
не может осуществить выбирать спецификацию. Это не может возвратить ошибки, если пользователь предоставляет недопустимую опцию. Необходимо сделать собственную проверку ошибок, поскольку Вы анализируете OPTARG. Поэтому, в то время как возможно написать больше кода для работы вокруг отсутствия поддержки долгих опций, это - намного больше работы и частично побеждает цель использовать getopt синтаксический анализатор для упрощения кода.
Встроенное getopts
не может сделать этого. Существует внешнее getopt (1) программа, которая может сделать это, но Вы только получаете его на Linux от util-linux пакет. Это идет со сценарием getopt-parse.bash в качестве примера.
существует также getopts_long
записаны как функция оболочки.
getopt
был включен в версию 1.0 FreeBSD в 1993 и была часть FreeBSD с тех пор. По сути, это было принято из FreeBSD 4.x для включения в Apple' s проект Darwin. С OS X 10.6.8, страница справочника, включенная Apple, остается точным дубликатом страницы справочника FreeBSD. Таким образом да, it' s включенный в OS X и рты других операционных систем около Linux.-1 на этом ответе для дезинформации.
– ghoti
27.03.2012, 17:41
Встроенное getopts
команда тихо, AFAIK, ограниченный односимвольными опциями только.
существует (или используется, чтобы быть) внешняя программа getopt
, которая реорганизовала бы ряд опций, таким образом, что было легче проанализировать. Вы могли адаптировать тот дизайн для обработки долгих опций также. Использование в качестве примера:
aflag=no
bflag=no
flist=""
set -- $(getopt abf: "$@")
while [ $# -gt 0 ]
do
case "$1" in
(-a) aflag=yes;;
(-b) bflag=yes;;
(-f) flist="$flist $2"; shift;;
(--) shift; break;;
(-*) echo "[110]: error - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
# Process remaining non-option arguments
...
Вы могли использовать подобную схему с getoptlong
команда.
Примечание, что фундаментальная слабость с внешним getopt
программа является трудностью обработки споров с пробелами в них, и в сохранении тех пробелов точно. Поэтому встроенное getopts
выше, хотя ограничено фактом, он только обрабатывает однобуквенные опции.