多数の引数を持つシェル スクリプトを呼び出しています./train-rnn.sh 0 0 0 "63 512"
。各引数を特定の位置パラメータに割り当てることは可能ですか? 例えば
./train-rnn.sh $1=0 $2=0 $4=0 $3="63 512"
多数の引数を持つシェル スクリプトを呼び出しています./train-rnn.sh 0 0 0 "63 512"
。各引数を特定の位置パラメータに割り当てることは可能ですか? 例えば
./train-rnn.sh $1=0 $2=0 $4=0 $3="63 512"
Bash にはそのためのメカニズムはありませんが、何かを調理することはできます。
最善の方法は、スクリプト内のコマンド ライン引数を解析することです。option=argument
その場合、ユーザー (および開発者も!) に 、 などの意味を覚えてもらう代わりに$1
、フォームのオプションを許可することで、ユーザー エクスペリエンスを向上させたい場合があります$2
。
#! /usr/bin/env bash
declare -A opt
for arg; do
if [[ "$arg" =~ ^([^=]+)=(.*) ]]; then
opt["${BASH_REMATCH[1]}"]=${BASH_REMATCH[2]}
else
echo "Error: Arguments must be of the form option=..." >&2
exit 1
fi
done
# "${opt["abc"]}" is the value of option abc=...
# "${opt[@]}" is an unordered (!) list of all values
# "${!opt[@]}" is an unordered (!) list of all options
使用例:
script.sh abc=... xyz=...
本当に位置パラメータに固執したい場合は、使用してください
#! /usr/bin/env bash
param=()
for arg; do
if [[ "$arg" =~ ^\$([1-9][0-9]*)=(.*) ]]; then
param[BASH_REMATCH[1]]=${BASH_REMATCH[2]}
else
echo "Error: Arguments must be of the form $N=... with N>=1" >&2
exit 1
fi
done
if ! [[ "${#param[@]}" = 0 || " ${!param[*]}" == *" ${#param[@]}" ]]; then
echo "Error: To use $N+1 you have to set $N too" >&2
exit 1
fi
set -- "${param[@]}"
# rest of the script
# "$@" / $1,$2,... are now set accordingly
使用例:
script.sh $1=... $3=... $2=...
上記のアプローチは、スクリプト/プログラムを変更できない場合のラッパーとしても使用できます。これを行うには、 に置き換えset -- "${param[@]}"
てexec program "${param[@]}"
から使用しますwrapper.sh $1=... $3=... $2=...
。