문제를 해결할 수 있는 몇 가지 질문이 있지만 다음을 시도하고 싶습니다.
이 질문에서는 기본적으로 배열을 환경 변수로 사용한 다음 문자열을 개별 배열 요소에 저장하려고 합니다.
a=('Apple Tomato' 'Banana Carrot') bash -c \
'b=($(echo "${a}")); echo -e "${b[0]}\n"; echo "${b[1]}";'
산출
(Apple
Tomato
원하는 출력:
사과 토마토
바나나 당근
관찰하다:
또한 원본 배열의 작은따옴표로 묶인 배열 요소 안에 큰따옴표가 있으면 따옴표가 유지됩니다. 예를 들어:a=('Apple "Tomato"' 'Banana "Carrot"')
답변1
환경 변수는 간단한 문자열 키-값 쌍입니다. 배열은 환경 변수가 될 수 없습니다.
그러나 배열의 값을 스크립트 a
에 전달할 수 있습니다.bash -c
bash -c 'printf "%s\n" "$@"' bash "${a[@]}"
b
또는 스크립트에서 배열을 호출하려는 경우:
bash -c 'b=( "$@" ); printf "%s\n" "${b[@]}"' bash "${a[@]}"
두 경우 모두 배열의 요소는 a
스크립트의 명령줄을 통해 전달됩니다. 이는 스크립트의 "$@"
(in "$1"
등 "$2"
) 에 표시된다는 의미입니다 bash -c
.
귀하의 질문에서 무슨 일이 일어나고 있는지는 명령이
a=('Apple Tomato' 'Banana Carrot') bash -c '...'
변수를 a
string 으로 설정합니다 (Apple Tomato Banana Carrot)
. 스크립트 a
의 환경 변수 값은 다음과 같습니다 bash -c
.
$ a=('Apple Tomato' 'Banana Carrot') bash -c 'printf "%s\n" "$a"'
(Apple Tomato Banana Carrot)
만약 너라면진짜데이터를 환경 변수로 전달해야 하는 경우 구분 기호를 결정한 다음 배열을 단일 문자열로 평면화하면 됩니다.
예를 들어:
IFS=:
b="${a[*]}" bash -c 'set -f; IFS=:; a=( $b ); printf "%s\n" "${a[@]}"'
그러면 문자열이 구성되고 해당 문자열을 사용하여 스크립트 값으로 Apple Tomato:Banana Carrot
환경 변수가 생성됩니다 .b
bash -c
그런 다음 스크립트는 다시 분할되어 b
분할 :
된 단어를 자체 a
배열에 할당합니다.
set -f
따옴표 없이 분할된 단어에 파일 이름 와일드카드를 호출하지 않으려면 스크립트에서 사용해야 합니다 $b
.
IFS
그런 다음 상위 셸 에서 원래 값을 복원하려고 합니다 bash -c
(더 쉽게 만들려면 이전 값을 변수에 저장할 수 있습니다). bash -c
를 사용하여 스크립트에서 파일 이름 글로빙을 다시 활성화 할 수도 있습니다 set +f
.
ifs=$IFS; IFS=:
b="${a[*]}" bash -c 'set -f; ifs=$IFS; IFS=:; a=( $b ); IFS=$ifs; unset ifs; set +f; printf "%s\n" "${a[@]}"'
IFS=$ifs; unset ifs