これを1時間検索しても答えが見つからないのは驚くべきことです。次のように、配列をスクリプトに渡したいと思います。
test.sh argument1 array argument2
これを次のような別のbashスクリプトに入れたくありません:
array=(a b c)
for i in "${array[@]}"
do
test.sh argument1 $i argument2
done
スクリプトarrArg.sh
を次のようにします。
#!/bin/bash
arg1="$1"
arg2=("${!2}")
arg3="$3"
arg4=("${!4}")
echo "arg1=$arg1"
echo "arg2 array=${arg2[@]}"
echo "arg2 #elem=${#arg2[@]}"
echo "arg3=$arg3"
echo "arg4 array=${arg4[@]}"
echo "arg4 #elem=${#arg4[@]}"
シェルで次のようにアレイをセットアップします。
arr=(ab 'x y' 123)
arr2=(a1 'a a' bb cc 'it is one')
そして、次のように引数を渡します。
. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]"
上記のスクリプトは以下を出力します:
arg1=foo
arg2 array=ab x y 123
arg2 #elem=3
arg3=bar
arg4 array=a1 a a bb cc it is one
arg4 #elem=5
注:. ./script
構文を使用してスクリプトを実行しているのは奇妙に思えるかもしれません。これは、現在のシェル環境でスクリプトのコマンドを実行するためのものであることに注意してください。
Q.なぜ現在のシェル環境で、なぜサブシェルではないのですか?
A. bash の作成者自身がここに文書化したように、bash は配列変数を子プロセスにエクスポートしないためです。