쉘 스크립트: 특정 전역 변수를 선택하려면 keyward를 사용하십시오.

쉘 스크립트: 특정 전역 변수를 선택하려면 keyward를 사용하십시오.

쉘 스크립트에 동일한 패턴을 가진 전역 변수가 여러 개 있습니다. 예를 들면 다음과 같습니다.

VALID_DOMESTIC_ANIMAL=(cat dog)
VALID_ACQUATIC_ANIMAL=(shark dolphin)

이제 ACQUATIC/DOMESTIC일 수 있는 또 다른 매개변수 CATAGORY가 있습니다. 반복할 예상 전역 변수를 선택하는 방법은 무엇입니까? 다음 코드를 시도했습니다.

#!/bin/bash
VALID_DOMESTIC_ANIMAL=(cat dog)
VALID_ACQUATIC_ANIMAL=(shark dolphin)

CATAGORY=ACQUATIC
VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL
#echo "VALID_CATAGORY_ANIMAL ${VALID_CATAGORY_ANIMAL}"
for anime in "${VALID_CATAGORY_ANIMAL[@]}"; do
    echo "${anime}"
done

출력을 기대했지만 shark dolphin결과가 나왔습니다.VALID_ACQUATIC_ANIMAL

동일한 이름의 변수가 존재하는 경우 이를 사용하도록 bash 스크립트에 어떻게 지시합니까?

답변1

감사해요강철 드라이버앞으로 나아갈 길을 가리킨다변수 - 합집합. 나는 nameref를 사용하는데 그것은 나에게 효과적입니다. 다음 변경 사항을 수행하면 성공했습니다.

-VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL
+declare -n VALID_CATAGORY_ANIMAL=VALID_${CATAGORY}_ANIMAL

답변2

이렇게 하면 상황이 더 명확해질 수 있습니다. 이 변수에는 다른 변수의 이름이 포함되어 있습니다. 해당 값을 얻으려면 쉘은 먼저 변수 이름을 확장한 다음 변수 값을 확장해야 합니다.

for anime in $(eval echo \${$VALID_CATAGORY_ANIMAL[@]}); do

eval- 변수를 확장하고 실행을 위해 이를 셸에 전달하는 데 인수가 필요합니다.
첫 번째 달러 기호를 이스케이프했기 때문에 명령은 다음에서 실행됩니다.

$(echo ${VALID_ACQUATIC_ANIMAL[@]}

루프 앞에 다음 줄을 삽입할 수 있습니다.

echo $VALID_CATAGORY_ANIMAL    #VALID_ACQUATIC_ANIMAL
echo \${$VALID_CATAGORY_ANIMAL[@]}    #${VALID_ACQUATIC_ANIMAL[@]}
eval echo \${$VALID_CATAGORY_ANIMAL[@]}    #shark, dolphin

관련 정보