Передача именованных аргументов в сценарии оболочки

Есть ли простой способ передать (получить) именованные параметры в сценарий оболочки?

Например,

my_script -p_out '/some/path' -arg_1 '5' 

И внутри my_script.sh принимают их как:

 # I believe this notation does not work, but is there anything close to it? p_out=$ARGUMENTS['p_out'] arg1=$ARGUMENTS['arg_1'] printf "Argument p_out is %s" "$p_out" printf "Argument arg_1 is %s" "$arg_1" 

Возможно ли это в Bash или Zsh?

8 Solutions collect form web for “Передача именованных аргументов в сценарии оболочки”

Вероятно, ближайший синтаксис:

 p_out='/some/path' arg_1='5' my_script 

Если вы не возражаете ограничиться однобуквенными именами аргументов, то есть my_script -p '/some/path' -a5 , то в bash вы можете использовать встроенные getopts , например

 #!/bin/bash while getopts ":a:p:" opt; do case $opt in a) arg_1="$OPTARG" ;; p) p_out="$OPTARG" ;; \?) echo "Invalid option -$OPTARG" >&2 ;; esac done printf "Argument p_out is %s\n" "$p_out" printf "Argument arg_1 is %s\n" "$arg_1" 

Тогда вы можете сделать

 $ ./my_script -p '/some/path' -a5 Argument p_out is /some/path Argument arg_1 is 5 

Существует полезный учебник Small getopts или вы можете ввести help getopts в командной строке.

Я украл это с drupal.org , но вы могли бы сделать что-то вроде этого:

 while [ $# -gt 0 ]; do case "$1" in --p_out=*) p_out="${1#*=}" ;; --arg_1=*) arg_1="${1#*=}" ;; *) printf "***************************\n" printf "* Error: Invalid argument.*\n" printf "***************************\n" exit 1 esac shift done 

Единственное предостережение в том, что вам нужно использовать синтаксис my_script --p_out=/some/path --arg_1=5 .

С помощью zsh вы можете использовать zparseopts :

 #! /bin/zsh - zmodload zsh/zutil zparseopts -A ARGUMENTS -p_out: -arg_1: p_out=$ARGUMENTS[--p_out] arg1=$ARGUMENTS[--arg_1] printf 'Argument p_out is "%s"\n' "$p_out" printf 'Argument arg_1 is "%s"\n' "$arg_1" 

Но вы должны вызвать скрипт с myscript --p_out foo .

Обратите внимание, что zparseopts не поддерживает сокращение длинных опций или синтаксис --p_out=foo такой как GNU getopt(3) .

Я просто придумал этот скрипт

 while [ $# -gt 0 ]; do if [[ $1 == *"--"* ]]; then v="${1/--/}" declare $v="$2" fi shift done 

передайте его как my_script --p_out /some/path --arg_1 5 а затем в скрипте вы можете использовать $arg_1 и $p_out .

Это мой сценарий и работает:

 for ARGUMENT in "$@" do KEY=$(echo $ARGUMENT | cut -f1 -d=) VALUE=$(echo $ARGUMENT | cut -f2 -d=) case "$KEY" in STEPS) STEPS=${VALUE} ;; REPOSITORY_NAME) REPOSITORY_NAME=${VALUE} ;; *) esac done echo "STEPS = $STEPS" echo "REPOSITORY_NAME = $REPOSITORY_NAME" 

Применение

 bash my_scripts.sh STEPS="ABC" REPOSITORY_NAME="stackexchange" 

Результат консоли:

 STEPS = ABC REPOSITORY_NAME = stackexchange 

STEPS и REPOSITORY_NAME готовы к использованию в скрипте.

Не имеет значения, в каком порядке находятся аргументы.

Надеюсь это поможет.

Если функция или приложение имеют более нуля аргументы, у нее всегда есть последний аргумент.

Если вы хотите прочитать флаги и пары параметров, как в: $ ./t.sh -o output -i input -l last

И вы хотите принять переменное количество пар опций / значений,

И не хочу, чтобы огромное «если .. то .. еще .. fi» дерево,

Затем, после проверки количества аргументов, отличных от нуля и четного,

Напишите цикл while с этими четырьмя операторами eval как тело, за которым следует оператор case, используя два значения, определенные в каждом проходе через цикл.

Здесь показана сложная часть сценариев:

 #!/bin/sh # For each pair - this chunk is hard coded for the last pair. eval TMP="'$'$#" eval "PICK=$TMP" eval TMP="'$'$(($#-1))" eval "OPT=$TMP" # process as required - usually a case statement on $OPT echo "$OPT \n $PICK" # Then decrement the indices (as in third eval statement) :<< EoF_test $ ./t.sh -o output -i input -l last -l last $ ./t.sh -o output -l last -l last $ ./t.sh -l last -l last EoF_test 
 mitsos@redhat24$ my_script "a=1;b=mitsos;c=karamitsos" #!/bin/sh eval "$1" 

вы просто ввели параметры командной строки внутри области сценария!

  • Right Distro для текстовых потребностей
  • Добавить аргументы из предыдущей команды для завершения zsh
  • Как я могу расширить все переменные в командной строке в Zsh?
  • Измерьте время выполнения команды, включая расширение подстановки команд
  • Зачем кому-то помещать что-либо в / etc / zshenv или ~ / .zshenv?
  • Стандартное завершение Zsh отлично работает, так почему люди рекомендуют загружать модуль compinit?
  • Zsh, нечувствительное между `_` и` -`
  • Выберите пользовательский запрос zsh на основе того, какой эмулятор я использую
  • Как отредактировать командную строку в полноэкранном редакторе в ZSH?
  • Внедрить десериализацию значения ключа или что-то подобное
  • Почему urxvtc не активирует функции zsh при вызове с аргументом «-c»?
  • Linux и Unix - лучшая ОС в мире.