最初の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
。
何が悪いのですか、どうすれば修正できますか?
私の知る限り、できません。あなたはそれをシリアル化し、逆シリアル化する必要があります。引数配列を介して:
最初
_#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
second "${ar[@]}" #this is equivalent to: second foo bar baz bat
_
秒
_#!/bin/bash
arr=( "$@" )
printf ' ->%s\n' "${arr[@]}"
<<PRINTS
-> foo
-> bar
-> baz
-> bat
PRINTS
_
少しアドバイス:
export
ed変数のすべてのキャップを予約"${someArray[@]}"
_は常に二重引用符で囲む必要があります。この数式は、_'array item 0' 'array item 1' 'aray item 2' 'etc.'
_とまったく同じように動作します(someArray=( 'array item 0' 'aray item 1' 'aray item 2' 'etc.' )
を想定)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 ")")"
sh
はsecond.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=( "$@" )
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
最初
#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
./second "${ar[@]}"
秒
#!/bin/bash
read -a arr1 <<< "${BASH_ARGV[@]}"
echo "${arr1[@]}"
これで十分なはずですが、配列の順序が逆なので、追加しました。
for (( i=${#arr1[@]}-1,j=0 ; i>=0 ; i--,j++ ))
do
arr2[j]="${arr1[i]}"
done
echo "${arr2[@]}"
read -a
は入力を配列arr1に読み取りますが、何らかの理由でわかりません。配列が逆になっているため、配列をarr2に戻します。