a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1)); do
echo $a$i
done
나는 다음을 시도했다
echo ${a$i}
echo $((ai))
echo ${a}${i}
c=$(echo a$i)
하지만 누구도 정답을 갖고 있지 않습니다.
답변1
이는 ksh93 구문입니다(이제 ((i=1;i<=3;i=i+1))
and에서도 지원됩니다(and 사이에 공백이 필요함).bash
zsh
for
((
zsh
ksh93
최신 버전 bash
(4.3, 2014 이상) 에서는 다음을 수행할 수 있습니다.
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
typeset -n name="a$i"
printf '%s\n' "$name"
done
에서는 zsh
변수 간접 구문을 사용할 수 있습니다: ${(e)code}
(1996년 5월 이후), ${(P)name}
(1999년 이후)
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
name=a$i
printf '%s\n' "${(P)name}"
# or
code="\$a$i"
printf '%s\n' "${(e)code}"
# or combined:
printf '%s\n' "${(e):-\$a$i}" "${(P)${:-a$i}}"
done
bash
또한 자체 변수 간접 지정 기능을 추가했지만 ksh93과 거의 반대되는 의미를 갖는 다른 구문(1996년 12월 2.0)을 사용했습니다.
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1));do
name=a$i
printf '%s\n' "${!name}"
done
POSIX 셸(ksh93, bash 또는 zsh를 포함하되 이에 국한되지 않음)을 사용하면 언제든지 다음을 수행할 수 있습니다.
a1="one"
a2="two"
a3="three"
i=1; while [ "$i" -le 3 ]; do
name=a$i
eval "value=\${$name}"
printf '%s\n' "$value"
i=$((i + 1))
done
답변2
Bash에서 원하는 변수 이름이 포함된 변수가 있는 경우 간접 참조를 사용하여 액세스할 수 있습니다.
a1="one"
a2="two"
a3="three"
for((i=1;i<=3;i=i+1));do
name="a$i"
printf '%s\n' "${!name}"
done
확장 매개변수를 사용 ${...}
하고 첫 번째 문자가 이면 !
나머지 문자는 액세스하려는 매개변수 이름을 포함하는 매개변수 이름으로 처리됩니다.
답변3
Bash를 사용하는 경우 동일한 작업을 수행하는 가장 쉬운 방법은 배열을 사용하는 것입니다.
a[1]="one"
a[2]="two"
a[3]="three"
for ((i=1; i<=3; i=i+1)); do
echo "${a[$i]}"
done
배열을 반복할 수도 있습니다.
for value in "${a[@]}"; do
echo "$value"
done
답변4
이 경로로 가야 한다면 bash
다음을 수행하십시오. 아이디어는 다음을 사용하는 것입니다 eval
.
#!/bin/bash
a1="one"
a2="two"
a3="three"
for ((i=1;i<=3;i=i+1)); do
var="a${i}"
eval out=\$${var}
echo $out
done
산출:
하나 둘 셋
이 eval
방법을 사용하면 참조 변수의 값을 가져올 수 있습니다. 따라서 변수 이름 자체(위의 "a${i}" var
, 즉 a1, a2 등)가 있으면 eval
내장 함수를 통해 변수의 값을 얻을 수 있습니다.
다음은 몇 가지 토론입니다.Bash의 "eval" 명령은 무엇입니까?