() 구문에 변수를 사용할 수 있나요?
#!/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
모든 종류의 문제가 발생할 수 있으므로 사용자 입력으로 설정되지 않았는지 확인하십시오 .