В getopt
командной строке bash есть команда. getopt
может использоваться с короткими опциями (такими как getopt -o axby "$@"
), и может использоваться как с короткими, так и длинными опциями (такими как getopt -o axby -l long-key -- "$@"
), но теперь мне нужны только длинные опции (т.е. короткие опции вообще не существуют), однако команда getopt -l long-key -- "$@"
не --long-key
вариант разбора правильно. Итак, как я могу использовать getopt
команду только с длинными параметрами? Или это невозможно или это просто ошибка getopt
команды?
13
getopts
, но вы используете/usr/bin/getopt
команду.Ответы:
getopt
отлично подходит без коротких вариантов. Но вы должны сказать, что у вас нет коротких вариантов. Это причуды в синтаксисе - из руководства:Вот что происходит в вашем тесте:
getopt -l long-key -- --long-key foo
рассматривается--long-key
как список параметров-egklnoy
иfoo
единственный аргумент. использованиенапример
источник
getopts
иgetopt
заразить ваш ответ? Вы начинаете с комментирования,getopts
затем только упоминанияgetopt
.getopt
программе GNU coreutils, о которой идет речь. Я исправил текст, который сказалgetopts
. Благодарю.getopts
даже не делает длинных опций, так что ничего из этого не применимо кgetopts
.getopts
тег. Я не хотел менять ваш ответ, потому что вы, как правило, гораздо лучше меня знаете, о чем пишете :-)Не знаю,
getopt
ноgetopts
встроенный может использоваться для обработки только длинных опций, как это:Конечно, это не работает, если предполагается, что у длинных опций есть аргументы. Это может быть сделано, но, как я уже научился работать над этим. Хотя я изначально включил его здесь, я понял, что для длинных опционов он не очень полезен. В этом случае это было только сокращение моих
case
(match)
полей одним, предсказуемым символом. Теперь, что я знаю, это то, что он отлично подходит для коротких опций - он наиболее полезен, когда он циклически перебирает строку неизвестной длины и выбирает отдельные байты в соответствии со своей опцией-строкой. Но когда опцией является аргумент arg, сfor var do case $var in
комбинацией вы мало что можете сделать. Я думаю, что лучше быть проще.Я подозреваю, что то же самое верно,
getopt
но я не знаю достаточно об этом, чтобы сказать с уверенностью. Учитывая следующий массив Arg, я продемонстрирую свой собственный маленький ARG анализатор - которая зависит в первую очередь от отношения evalation / назначения я пришел , чтобы оценить дляalias
и$((shell=math))
.Это строка аргумента, с которой я буду работать. Сейчас:
Это обрабатывает массив arg одним из двух разных способов, в зависимости от того, передаете ли вы ему один или два набора аргументов, разделенных
--
разделителем. В обоих случаях это относится к последовательностям обработки массива arg.Если вы называете это как:
Первым делом будет написано, что его
acase()
функция выглядит следующим образом:И рядом с
shift 3
. Подстановка команды вacase()
определении функции оценивается, когда вызывающая оболочка создает входные документы функции здесь, ноacase()
никогда не вызывается и не определяется в вызывающей оболочке. Он вызывается в подоболочке, хотя, конечно, и таким образом вы можете динамически указывать интересующие вас параметры в командной строке.Если вы передаете ему массив без разделителей, он просто заполняется
acase()
совпадениями для всех аргументов, начинающихся со строки--
.Функция выполняет практически всю свою обработку в подоболочке - итеративно сохраняя каждое из значений аргумента в псевдонимах, присвоенных ассоциативным именам. Когда он завершается, он печатает каждое сохраненное значение,
alias
указанное в POSIX, для печати всех сохраненных значений, указанных в кавычках, таким образом, что их значения могут быть повторно введены в оболочку. Поэтому, когда я делаю ...Его вывод выглядит так:
Проходя по списку аргументов, он проверяет соответствие блоку case. Если он находит совпадение, он бросает флаг -
f=optname
. Пока он снова не найдет допустимую опцию, он будет добавлять каждый последующий аргумент в массив, который он строит, основываясь на текущем флаге. Если один и тот же параметр указан несколько раз, результаты составляются и не переопределяются. Все, что не в данном случае - или любые аргументы после игнорируемых опций - присваиваются игнорируемому массиву.Вывод защищен от оболочки для автоматического ввода оболочкой, и поэтому:
... должен быть в полной безопасности. Если по какой-либо причине это небезопасно, вам, вероятно, следует подать отчет об ошибке в службу поддержки оболочки.
Он присваивает два вида значений псевдонимов для каждого совпадения. Во-первых, он устанавливает флаг - это происходит независимо от того, предшествует ли параметр несоответствующим аргументам. Таким образом, любое вхождение
--flag
в списке аргументов сработаетflag=1
. Это не соединение ---flag --flag --flag
просто получаетflag=1
. Это значение делает приращение , хотя - для каких - либо аргументов , которые могли бы следовать за ним. Может использоваться как ключ индекса. После выполненияeval
вышеизложенного я могу сделать:...получить...
И так:
ВЫХОД
И для аргументов, которые не совпадают, я бы подставил значение ignore в
for ... in
поле выше, чтобы получить:источник