첫 번째 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
약간의 조언:
export
ed 변수의 모든 대문자를 유지하십시오 ."${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로 반전됩니다.