연관 배열 선언에 이 구문이 작동하지 않는 이유 [닫기]

연관 배열 선언에 이 구문이 작동하지 않는 이유 [닫기]

() 구문에 변수를 사용할 수 있나요?

#!/bin/bash
declare -A c
declare -A b
a="[a]=0 [b]=1 [c]=2 [d]=3"
b=($a) # or b=($(echo "$a"))
echo "***********${b[@]}*********"  #********************

c=([a]=0 [b]=1 [c]=2 [d]=3)
echo "---------${c[@]}----------"  #---------0 1 2 3----------

답변1

현재 (내가 아는 한) Bash에서 문자열을 가져와서 연관 배열을 만드는 것은 불가능합니다. 따라서 명령문을 사용하기 전에 이를 "평가"해야 합니다 eval.

Bash 버전 4.1.7을 사용하여 예제를 실행하면 다음과 같은 결과가 나타납니다.

$ ./arr.bash 
./arr.bash: line 5: b: [a]=0: must use subscript when assigning associative array
./arr.bash: line 5: b: [b]=1: must use subscript when assigning associative array
./arr.bash: line 5: b: [c]=2: must use subscript when assigning associative array
./arr.bash: line 5: b: [d]=3: must use subscript when assigning associative array

다음 줄을 작동하도록 변경하세요.

eval "b=($a)" # or b=($(echo "$a"))

이제 다시 실행하면 예상되는 결과를 얻을 수 있습니다.

$ ./arr.bash 
***********0 1 2 3*********
---------0 1 2 3----------

설명하다

다음과 같은 제목의 Q&A를 찾았습니다.Bash: 연관 배열을 다른 변수 이름(예: 변수 이름 바꾸기)에 할당하는 방법은 무엇입니까?, 이는 이를 수행하는 한 가지 방법을 설명 declare하지만 해당 메소드가 실제로 얼마나 읽기 어렵고 사용해서는 안 되는지 보여줍니다.

# declare associative array
declare -A assoc_array=(["key1"]="value1" ["key2"]="value2")
# convert associative array to string
assoc_array_string=$(declare -p assoc_array)
# create new associative array from string
eval "declare -A new_assoc_array="${assoc_array_string#*=}
# show array definition
declare -p new_assoc_array

이 메소드는 $assoc_array문자열로의 변환을 표시한 다음 다시 연관 배열로 표시합니다 $new_assoc_array. 그러나 이 방법도 사용의 필요성을 피할 수는 없습니다 eval. 이는 이해하기 어려운 코드 조각이며 이를 피해야 하는 이유를 보여줍니다.

답변2

당신은해야합니다

eval "b=($a)"

eval해당 매개변수는 매개변수 확장 후 쉘 명령으로 평가됩니다. 하지만 주의해서 사용하시기 바랍니다. $a모든 종류의 문제가 발생할 수 있으므로 사용자 입력으로 설정되지 않았는지 확인하십시오 .

관련 정보