![셸, 두 문자열을 연결하여 세 번째 변수를 참조](https://linux55.com/image/45470/%EC%85%B8%2C%20%EB%91%90%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%97%B0%EA%B2%B0%ED%95%98%EC%97%AC%20%EC%84%B8%20%EB%B2%88%EC%A7%B8%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%B0%B8%EC%A1%B0.png)
내 스크립트에서 다음을 수행하려고합니다.
#/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 확장을 사용할 수 있습니다.