다음과 같은 상황에 있을 때:
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" )