web-dev-qa-db-ja.com

名前付き引数をシェルスクリプトに渡す

名前付きパラメーターをシェルスクリプトに渡す(受信する)簡単な方法はありますか?

例えば、

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 "The Argument p_out is %s" "$p_out"
printf "The Argument arg_1 is %s" "$arg1"

これはBashまたはZshで可能ですか?

134

1文字の引数名に限定されることを気にしない場合、つまり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

役立つ 小さなgetoptsチュートリアル またはhelp getoptsシェルプロンプト。

170
steeldriver

これを 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を使用する必要があることです。

43
cdmo

私はこのスクリプトを使用して、魅力のように機能します。

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をスクリプトで使用する準備が整いました。

引数の順序は関係ありません。

36
JRichardsz

これにおそらく最も近い構文は次のとおりです。

p_out='/some/path' arg_1='5' my_script
36
Hauke Laging

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は、長いオプションの省略や、GNU getopt(3)のような_--p_out=foo_構文をサポートしていません。

15

このスクリプトを思いついたばかりです

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を使用できます。

12
Shahzad Malik