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

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

最初のbashシェルスクリプトから2番目のスクリプトに配列を変数として渡す方法。

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

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

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

答え1

AFAIK、できません。たとえば、パラメータ配列を介して直列化して逆シリアル化する必要があります。

最初

#!/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

少しアドバイス:

  • exported変数のすべての大文字を保持してください。
  • "${someArray[@]}"この式がまったく同じように機能しない非常に特別な理由がない場合は、常に二重引用符を使用する必要があります'array item 0' 'array item 1' 'aray item 2' 'etc.' (仮定someArray=( 'array item 0' 'aray item 1' 'aray item 2' 'etc.' ))。

答え2

配列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一部の配列要素に空白文字が含まれている場合に安全な単一パラメータを偽にするために使用されます。

2番目.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[@]}"

2番目.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

答え3

最初

#!/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に反転されます。

関連情報