2014-09-10 2 views
1

주 사이트에서 여러 대행사로 파일 복사를 단순화하기 위해 Bash 스크립트를 작성하고 있습니다. 오류 여기Bash : 연관 배열 이름으로 변수 사용

#!/bin/bash 

declare -A GROUP1 
declare -A GROUP2 
declare -A GROUP3 
declare -A ARRAY 

GROUP1["SITE1"]="x.x.x.x" 
GROUP1["SITE2"]="y.y.y.y" 
GROUP1["SITE3"]="z.z.z.z" 

GROUP2["SITE1"]="1.1.1.1" 
GROUP2["SITE2"]="2.2.2.2" 
GROUP2["SITE3"]="3.3.3.3" 

GROUP2["SITE1"]="a.a.a.a" 
GROUP2["SITE2"]="b.b.b.b" 
GROUP2["SITE3"]="c.c.c.c" 

read -p "Choose a group of sites : " group 

case $group in 
    1) DEST="GROUP1" ;; 
    2) DEST="GROUP2" ;; 
    3) DEST="GROUP3" ;; 
esac 

eval "ARRAY=(\${$DEST[@]})" 

for elem in "${!ARRAY[@]}" 
do 
    echo $elem 
    echo ${ARRAY[$elem]} 
done 

됩니다 :

./test: line28: TAB : 3.3.3.3 : must use subscript when assigning associative array 
./test: line28: TAB : 2.2.2.2 : must use subscript when assigning associative array 
./test: line28: TAB : 1.1.1.1 : must use subscript when assigning associative array 

무엇인가이 스크립트에서 , 내가 연관 배열 이름으로 변수를 사용하는 것을 시도하고 있지만 오류가 optain, 여기에 코드입니다 나는 가능한 것을 시도하고 있는가? 미리 감사드립니다.

답변

1

bash v4.3이 없으면 불가능하지만 쉽지 않습니다. 4.3으로, 당신은 "nameref"사용할 수 있습니다

declare -A GROUP1 
declare -A GROUP2 
declare -A GROUP3 

GROUP1["SITE1"]="x.x.x.x" 
#... 

# Yuk. Use command-line options, not stdin 
read -p "Choose a group of sites : " group 

for g in GROUP1 GROUP2 GROUP3; do if [[ $group == $g ]]; then 

    # Here's the nameref: After this executes, ARRAY is an alias for 
    # the indicated variable. 
    declare -n ARRAY=$group 
    break 

fi 

### This is documented but might not work depending on bash version 
### Instead you could test for existence of a known key: 
### if [[ ! -v ${ARRAY[SITE1]} ]]; then 
if [[ ! -R ARRAY ]]; then 
echo "No such group" >> /dev/stderr; exit 1 
fi 

확인을, 당신은 아마 아직 bash는 4.3 없지만 미래 위는 사람에게 유용 할 것이다. 그래서 그것 없이는, 당신이 제시 한 연관 배열을 복사하는 것과 같은 전략을 따를 수 있습니다. 배열이 크지 않으면 그렇게 나쁘지 않습니다. 이를 위해, 위의를 사용하지만 다음과 nameref 라인 (declare -n ARRAY=$group를) 대체 :

defn=$(declare -p $group) 
eval "${defn/$group/ARRAY}" 
unset defn 

을이 경우에, 당신은 사용의 성공을위한 대체 시험을해야합니다.


참고 : 정말 bash 변수 이름을 모두 대문자를 사용하는 것이 좋습니다 아니다. 관례는 시스템 생성 환경 변수와 쉘 내장 변수가 모두 대문자를 사용한다는 것입니다. 이러한 미리 정의 된 변수와 충돌하지 않도록 사용자 변수를 소문자로 사용해야합니다.

+0

답장을 보내 주셔서 감사합니다. 사용자 변수에 대문자를 사용하지 않았다는 것을 기억하지 못했습니다. 나는 내일 당신의 제안을 시도 할 것입니다. – Jaymzwise