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

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

Например,

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?

  • ls выводит несколько столбцов, даже если отправлен в grep с помощью zml-конфигурации grml
  • Как восстановить среду оболочки?
  • Таинственное повторение введенной команды в оболочке
  • Что делает ttyctl -f, и почему он позволяет управлять потоком в vim, mutt и т. Д.?
  • Почему не работает: while true; do "$ my_command"; сон 1; сделанный
  • В чем главная проблема, с которой сталкивается кто-то, мигрирующий из bash в zsh?
  • Автоматически помещать псевдоним в ~ / .bashrc или ~ / .zshrc
  • Удалять удаленные файлы, соответствующие локальным файлам, или удалять файлы по мере их загрузки
  • 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" 

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

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