Я знаю, что я могу легко получить позиционированные параметры, как это в Bash:
$0
или $1
Я хочу иметь возможность использовать такие параметры флага, чтобы указать, для чего используется каждый параметр:
mysql -u user -h host
Каков наилучший способ получить -u param
значение и -h param
значение по флагу, а не по позиции?
Ответы:
Это идиома, которую я обычно использую:
Ключевые моменты:
$#
количество аргументовисточник
--action*
и--output-dir*
дела?--action=[ACTION]
а также для случая, когда кто-то печатает--action [ACTION]
*)
ты ломаешься там, не должен ли ты выйти или проигнорировать плохой вариант? Другими словами часть никогда не обрабатывается.-bad -o dir
-o dir
Этот пример использует встроенную
getopts
команду Bash и взят из Руководства по стилю Google Shell :Примечание. Если за символом следует двоеточие (например
f:
), ожидается, что этот параметр будет иметь аргумент.Пример использования:
./script -v -a -b -f filename
Использование getopts имеет несколько преимуществ перед принятым ответом:
-a -b -c
→-abc
)Однако большим недостатком является то, что он не поддерживает длинные опции, а только односимвольные.
источник
?) printf '\nUsage: %s: [-a] aflag [-b] bflag\n' $0; exit 2 ;;
getopt твой друг .. простой пример:
В вашем каталоге / usr / bin должно быть несколько примеров.
источник
/usr/share/doc/util-linux/examples
, по крайней мере, на машинах с Ubuntu.Я думаю, что это послужило бы более простым примером того, чего вы хотите достичь. Нет необходимости использовать внешние инструменты. Встроенные инструменты Bash могут сделать эту работу за вас.
Это позволит вам использовать флаги, поэтому независимо от того, в каком порядке вы передаете параметры, вы получите правильное поведение.
Пример :
Вывод :
Вы можете добавить эту функцию в свой профиль или поместить ее в скрипт.
Спасибо!
Изменить: сохранить это как файл, а затем выполнить его как
yourfile.sh -last "Adios" -first "Hola"
источник
./hello.sh DOSOMETHING -last "Adios" -first "Hola"
return 1;
с последним примером выводитcan only 'return' from a function or sourced script
на macOS. Переключение наexit 1;
работу, как ожидалось, хотя.Другой альтернативой может быть использование чего-то вроде приведенного ниже примера, который позволит вам использовать длинные теги --image или short -i, а также разрешить скомпилированные -i = "example.jpg" или отдельные методы -i example.jpg для передачи аргументов ,
источник
Мне больше нравится ответ Роберта МакМахана, поскольку его легче всего превратить в файлы общего доступа для любых ваших сценариев. Но, похоже, есть ошибка с строкой, которая
if [[ -n ${variables[$argument_label]} ]]
выдает сообщение «переменные: неверный индекс массива». У меня нет респ комментировать, и я сомневаюсь , что это правильная «исправить» , но упаковка , чтоif
вif [[ -n $argument_label ]] ; then
очищает его.Вот код, который я закончил, если вы знаете лучший способ, пожалуйста, добавьте комментарий к ответу Роберта.
Включить файл "flags-declares.sh"
Включить файл "flags-arguments.sh"
Ваш "script.sh"
источник
Если вы знакомы с Python argparse и не против вызвать python для разбора аргументов bash, есть фрагмент кода, который я считаю действительно полезным и очень простым в использовании, называемый argparse-bash https://github.com/nhoffman/ argparse-баш
Пример берут из их скрипта example.sh:
источник
Я предлагаю простой TLDR :; пример для непосвященных.
Создайте bash-скрипт с именем helloworld.sh
Затем вы можете передать необязательный параметр
-n
при выполнении скрипта.Выполните скрипт так:
Вывод
Ноты
Если вы хотите использовать несколько параметров:
while getops "n:" arg: do
с помощью большего количества параметров, таких какwhile getops "n:o:p:" arg: do
o) Option=$OPTARG
иp) Parameter=$OPTARG
источник
Сохраните его как sample.sh и попробуйте запустить
в вашем терминале.
источник
У меня были проблемы с использованием getopts с несколькими флагами, поэтому я написал этот код. Он использует модальную переменную для определения флагов и использования этих флагов для назначения аргументов переменным.
Обратите внимание, что если у флага не должно быть аргумента, можно сделать что-то кроме установки CURRENTFLAG.
источник
Так что вот мое решение. Я хотел иметь возможность обрабатывать логические флаги без дефиса, с одним дефисом и с двумя дефисами, а также с параметром / назначением значения с одним и двумя дефисами.
Некоторые ссылки
declare
до$ bash -c "help declare"
.shift
до$ bash -c "help shift"
.источник