bash 쉘 스크립트에 배열을 전달하는 방법은 무엇입니까?

bash 쉘 스크립트에 배열을 전달하는 방법은 무엇입니까?

첫 번째 bash 쉘 스크립트에서 두 번째 스크립트로 배열을 변수로 전달하는 방법.

First.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
sh second.sh "$AR" # foo
sh second.sh "${AR[@]}" # foo
두 번째.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일부 배열 요소에 공백 문자가 포함된 경우 안전한 단일 매개변수를 가짜로 만드는 데 사용됩니다.

두 번째.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[@]}"

두 번째.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로 반전됩니다.

관련 정보