셸, 두 문자열을 연결하여 세 번째 변수를 참조

셸, 두 문자열을 연결하여 세 번째 변수를 참조

내 스크립트에서 다음을 수행하려고합니다.

#/bin/bash -x
var1=www
var2=www2
var3=www3
var4=www4
for i in 1 2 3 4; do
   echo \$var$i
done

분명히 이는 예상대로 작동하지 않으며 다음과 같은 결과가 출력됩니다.

$var1
$var2
$var3
$var4

루프에서 변수를 동적으로 참조하는 방법은 무엇입니까?

답변1

이것을 찾고 계십니까?

$ cat indirection.bash
#!/bin/bash -x

var1=www
var2=www2
var3=www3
var4=www4
for i in 1 2 3 4; do
        s="var${i}"
        echo "${!s}"
done

 

$ ./indirection.bash
www
www2
www3
www4

답변2

배열을 사용할 수 있습니다.

#/bin/bash -x

declare -a vars=(
    www
    www2
    www3
    www4
)

for var in "${vars[@]}"; do
   echo "$var"
done

또는 인덱스로 반복합니다.

for i in "${!vars[@]}"; do
    echo "${vars[$i]}"
done

답변3

일반적으로 쉘은 변수를 한 번만 확장합니다. 간접 확장을 사용하거나 쉘에 다시 확장하도록 요청할 수 있습니다. 예를 들면 다음과 같습니다.

eval "val=\$var$i"; echo "$val";

뿐만 아니라:

echo "\$var$i"

이 방법은 이식성이 매우 높지만 evil 을 eval 사용합니다 .

다른 답변에 표시된 대로 간접 확장을 사용합니다(매개변수 확장 참조).남자 난교${!VAR_NAME})는 이식성이 필요하지 않을 때 좋은 솔루션이며 BASH 확장을 사용할 수 있습니다.

답변4

사용연관 배열. 이와 같은 변수 이름을 생성할 이유가 없습니다.

해시 테이블 구현이 존재합니다.이것이는 쉘의 내부 기호 테이블을 직접 eval을 통해 해시 맵으로 남용하는 것보다 약간 더 간단할 것입니다. 나는 이 특정 문제를 자세히 분석하지 않았으며 이것이 어느 정도 수행되었을 가능성이 있습니다. nameref 구문 분석을 사용하는 것처럼 보이지만 여전히 개선되었습니다.

관련 정보