名前付きパラメーターをシェルスクリプトに渡す(受信する)簡単な方法はありますか?
例えば、
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' -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
シェルプロンプト。
これを 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
を使用する必要があることです。
私はこのスクリプトを使用して、魅力のように機能します。
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をスクリプトで使用する準備が整いました。
引数の順序は関係ありません。
これにおそらく最も近い構文は次のとおりです。
p_out='/some/path' arg_1='5' my_script
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
_構文をサポートしていません。
このスクリプトを思いついたばかりです
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
を使用できます。