it-swarm-ja.com

配列をbashシェルスクリプトに渡す方法は?

配列を変数として最初のbashシェルスクリプトから2番目のスクリプトに渡すにはどうすればよいですか。

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
sh second.sh "$AR" # foo
sh second.sh "${AR[@]}" # foo
#!/bin/bash
ARR=$1
echo ${ARR[@]}

どちらの場合も、結果はfooです。しかし、私が望む結果はfoo bar baz bat

何が間違っているので、どうすれば修正できますか?

1
Mowzer

AR配列は、最初の引数を介してsecond.shに渡されます。

first.sh

#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "$(printf "(" ; printf "'%s' " "${AR[@]}" ; printf ")")"

shsecond.shスクリプトの実行には使用されなくなったことに注意してください。

これらの連鎖されたprintfは、一部の配列要素にスペース文字が含まれている場合に安全な単一のパラメーターを偽造するために使用されます。

second.sh

#!/bin/bash
declare -a ARR=$1
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"

--------

AR配列が任意の数の引数を使用してsecond.shスクリプトに渡されるソリューションの場合。

first.sh

#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "${AR[@]}"

second.sh

#!/bin/bash
ARR=( "[email protected]" )
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"

--------

テスト:

$ chmod +x *sh
$ ./first.sh
AR array contains 4 elements: foo bar a space bat
ARR array contains 1 elements: foo
ARR array contains 4 elements: foo bar a space bat
2
Jay jargot