비대화형 쉘을 위한 환경 변수로 배열 저장

비대화형 쉘을 위한 환경 변수로 배열 저장

문제를 해결할 수 있는 몇 가지 질문이 있지만 다음을 시도하고 싶습니다.

이 질문에서는 기본적으로 배열을 환경 변수로 사용한 다음 문자열을 개별 배열 요소에 저장하려고 합니다.

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 '...'

변수를 astring 으로 설정합니다 (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환경 변수가 생성됩니다 .bbash -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

관련 정보