for 루프를 사용하여 var0, var1, var2, var3을 선언했습니다. for 루프 내에서 변수를 에코하는 방법은 무엇입니까? 코드는 다음과 같습니다.
#!/bin/bash
for i in {0..3}
do
export var$i=$i
done;
거기에서 var0, var1, var2, var3을 정의했습니다. 루프에서 어떻게 액세스할 수 있습니까?
나는 다음을 시도했다
for i in {0..3}
do
echo $var$i
tmpvar=var$i
echo $tmpvar
done
하지만 아무도 나에게 var0, var1의 값을 알려주지 않았습니다. 첫 번째 에코는 "0,1,2,3"만 인쇄했고 두 번째 에코는 "var0,var1,var2,var3"을 인쇄했습니다. 그래요? 나는 가치를 원한다..
답변1
반면,
var0=a
var1=b
var2=c
ksh93 또는 bash 4.3 이상의 경우 namerefs를 사용하여 개별 변수를 가리킬 수 있습니다.
for i in 0 1 2; do
typeset -n p="var$i"
echo "$p"
done
그러나 변수가 별도의 스칼라로 명시적으로 필요하고(예: 환경을 통해 변수를 전달하기 때문에) 엄격한 표준 셸을 사용하지 않고 대신 Bash 또는 ksh를 사용하지 않는 한 배열을 사용해야 합니다.
#!/bin/bash
a=(a b c)
for i in 0 1 2; do
echo "${a[i]}"
done
또는 색인을 무시하십시오.
for x in "${a[@]}"; do
echo "$x"
done
(물론 Zsh에는 기본적으로 1부터 인덱스되는 배열도 있으므로 첫 번째 배열은 직접 작동하지 않습니다.)
답변2
이를 달성하기 위해 eval을 사용할 수 있습니다.
$ var1='< 1 >'; var2='< 2 >'; var3='< 3 >'
$ for i in 1 2 3; do eval echo \$var$i; done
$ for i in 1 2 3; do eval "echo \$var$i"; done
$ for i in 1 2 3; do eval 'echo $var'$i; done
$ for i in 1 2 3; do eval "v=\$var$i"; echo "$v"; done
인용 및 이스케이프에 주의하세요. 값에 공백이나 와일드카드가 포함된 경우 처음 세 개는 값을 공백으로 분할한 다음 와일드카드와 일치하는 모든 파일 이름을 확장합니다. 이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다. 예를 들어:
$ var1='< x >' var2='< * >' $ for i in 1 2; 실행 eval echo \$var$i; <x> <[현재 디렉터리의 파일 이름 목록]>
(및 별도의 인수를 받은 이후 주변의 이중 공백이 x
단일 공백으로 축소되었습니다.)echo
<
x
>
이 문제를 해결하려면 변수 확장이 에서 참조되는지 확인해야 합니다 eval
. 예를 들면 다음과 같습니다.
$ for i in 1 2; do eval echo \"\$var"$i"\"; done
< x >
< * >
(또한 숫자가 포함되어 있지 않다는 $i
것을 알지 않는 한 위의 내용을 인용하십시오.)IFS