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

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

Например,

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" 

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

  • Что означают буквы в команде `fc`?
  • zsh: завершение меню для glob
  • Полный путь в glob в Zsh
  • Command-not-found не запускается для «сбоя» в ZSH без причины
  • Как передать переменные среды в новый сеанс входа в ssh?
  • Сохраните пробел после завершения для некоторых символов в zsh
  • Приостановите процесс молча с помощью ctrl-z
  • Ошибка перехвата «команда не найдена» в zsh
  • Как я могу получить тип данных переменных в zsh?
  • Заполнение ZSH с помощью команды output
  • Сделайте выбор автозаполнения zsh, даже если введено возможное совпадение
  • Как я могу «сшить» псевдонимы оболочки?
  • Interesting Posts

    Альтернатива командной строки linux для Windirstat / SpaceMonger?

    Как запустить cronjob каждые 4 часа минус 1 секунда

    Текущий вопрос: как я могу декомпилировать файл прошивки для рук, чтобы получить файл дерева устройств?

    Команда SED для форматирования текстового файла

    Восстановить rc.conf после случайного удаления во FreeBSD

    Как заставить ноутбук спящий режим, когда он достигнет некоторого низкого уровня заряда батареи?

    Как приостановить и возобновить процессы, такие как bash

    Как добавить программу для индексирования Synapse?

    как включить mcrypt в php5.5 с помощью rhel6.5

    Больше не может использовать SSH при переадресации портов

    Использование оболочки «: -» и преимущества

    Как отсортировать по 2 столбцам и сохранить верхнюю строку из каждой группы?

    Правило UDEV для запуска partprobe на устройстве loop

    Процессы дочернего процесса Linux не отбираются

    squid: Незаконная инструкция (ядро сбрасывается)

    Linux и Unix - лучшая ОС в мире.