名前付きパラメータをシェルスクリプトに渡す

名前付きパラメータをシェルスクリプトに渡す

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

例えば、

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でこれは可能ですか?

答え1

単一文字パラメータ名(例:)に制限されていても問題ない場合は、my_script -p '/some/path' -a5bashで組み込み機能を使用できます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
    exit 1
    ;;
  esac

  case $OPTARG in
    -*) echo "Option $opt needs a valid argument"
    exit 1
    ;;
  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シェルプロンプトに入力することもできます。

編集:オプションに引数がなく、後にsプログラムなどの他のオプションがある場合、ループのcase2番目のステートメントが実行されます。while-pmy_script -p -a5exit

答え2

これは、位置指定パラメーターのパーサーではなく、key=value aa=bbパラメーターのパーサーです。

for ARGUMENT in "$@"
do
   KEY=$(echo $ARGUMENT | cut -f1 -d=)

   KEY_LENGTH=${#KEY}
   VALUE="${ARGUMENT:$KEY_LENGTH+1}"

   export "$KEY"="$VALUE"
done

# use here your expected variables
echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"
echo "EXTRA_VALUES = $EXTRA_VALUES"

使用法

bash args_shell_parser.sh STEPS="ABC" REPOSITORY_NAME="stackexchange" \
           EXTRA_VALUES="KEY1=VALUE1 KEY2=VALUE2"

コンソール結果:

STEPS = ABC
REPOSITORY_NAME = stackexchange
EXTRA_VALUES = KEY1=VALUE1 KEY2=VALUE2

特徴:

  • 何も構わない注文する主張は
  • すべての変数を明示的に宣言する必要はありません。
  • 値は次のとおりです。スペース
  • パラメータ値に「=」記号が含まれる複雑なケースを処理します。

このコードをスクリプトの先頭に配置します。

このスクリプトの以前のバージョン:

答え3

私はそこから盗んだ。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

答え4

私はこのスクリプトを思い出しました。

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_1and を使用できます$p_out

関連情報