Bash 3には連想配列がないため、目的のために他の言語機能を使用する必要があります。bash 4の下でも、あなたが書いたコードはあなたが主張することをしないことに注意してください。連想配列の場合は何にも展開されない./script.sh ${ARG}
ため、連想配列を子スクリプトに渡しません。連想配列を子プロセスに渡すことはできません。とにかくそれをエンコードする必要があります。${ARG}
ARG
親スクリプトと子スクリプトの間で引数を渡すプロトコルを定義する必要があります。一般的な方法は、の形式で引数を渡すことkey=value
です。=
これは、文字がキーに表示されないことを前提としています。
また、親スクリプトと子スクリプトで連想配列を表す方法を理解する必要があります。同じ表現を使用する必要はありません。
連想配列を表す一般的な方法は、要素ごとに個別の変数を使用し、共通の名前付けプレフィックスを付けることです。これには、キー名がASCII文字(いずれの場合も)、数字、およびアンダースコアのみで構成されている必要があります。たとえば、の代わりに${myarray[key]}
、と記述し${myarray__key}
ます。キーが実行時に決定される場合は、最初に拡張のラウンドが必要です。代わりに${myarray[$key]}
、次のように記述します。
n=myarray__${key}; echo ${!n}
割り当てには、を使用しますprintf -v
。指定された値を使用するための%s
フォーマットに注意してください。フォーマットとして扱われ、printf拡張を実行するため、printf
書き込まないでください。printf -v "myarray__${key}" %s "$value"
$value
%
printf -v "myarray__${key}" %s "$value"
このように表された連想配列をkey=value
引数表現で子プロセスに渡す必要がある場合${!myarray__*}
は、名前が。で始まるすべての変数を列挙するために使用できますmyarray__
。
args=()
for k in ${!myarray__*}; do
n=$k
args+=("$k=${!n}")
done
子プロセスで、フォームの引数をkey=value
接頭辞付きの変数に変換するには、次のようにします。
for x; do
if [[ $x != *=* ]]; then echo 1>&2 "KEY=VALUE expected, but got $x"; exit 120; fi
printf -v "myarray__${x%%=*}" %s "${x#*=}"
done
ちなみに、これがあなたに必要なものだと確信していますか?別のbashスクリプトからbashスクリプトを呼び出す代わりに、代わりにサブシェルで子スクリプトを実行することをお勧めします。そうすれば、親のすべての変数から継承します。