연관 배열 요소에 대한 간접 할당

연관 배열 요소에 대한 간접 할당

다음과 같은 상황에 있을 때:

a=foo
b=baz

나는 사용할 수 있다

typeset "$a=$b"

그러나 a가 배열 요소를 참조하면 실패합니다.

$ a=foo[bar]
$ b=baz
$ typeset "$a=$b"
$ declare -p foo
declare -a foo=([0]="baz")

즉, bar는 어떤 이유로든 변수 이름으로 처리됩니다. declare -A foo=([bar]="baz")가급적이면 구문 분석 없이 결과를 얻을 수 있도록 이를 변경하는 방법에 대한 아이디어가 있습니까 $a?

답변1

foo연관 배열을 선언한 적이 없습니다 . 배열과 "스칼라"(일반 변수를 설명하는 데 더 나은 단어가 필요함)는 선언할 필요가 없지만 연관 배열은 선언합니다.

foo연관 배열로 선언하지 않았기 때문에 코드는 이를 foo[0]로 설정합니다 baz. 이는 산술 컨텍스트에서 사용되기 때문에 인덱스 0을 설정합니다 bar(일반적인 배열 할당이기 때문). 변수 는 bar일반 배열에서 인덱스로 사용되며 해당 값은 0이거나 설정되지 않았습니다(존재하지 않음).

즉, 선언의 어떤 내용도 연관 배열임을 foo[bar]=baz나타내지 않습니다. foo기본적으로 이는 일반 배열이며 bar산술적 맥락에서 일부 정수 인덱스로 해석됩니다(변수가 존재하지 않으면 해당 값은 0으로 평가됩니다).

원하는 것을 얻으려면 이를 foo연관 배열로 선언해야 합니다.

a=foo[bar]
b=baz

declare -A foo

typeset "$a=$b"
declare -p foo

이것은 출력됩니다

declare -A foo=([bar]="baz" )

관련 정보