![while 루프에서 변수를 동적으로 사용하는 방법](https://linux55.com/image/117883/while%20%EB%A3%A8%ED%94%84%EC%97%90%EC%84%9C%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EB%8F%99%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
Unix에서 다음 명령을 실행할 때 오류가 발생합니다. ksh 셸에서 3행이 작동하길 원합니다.
while [ ${i} -le 3 ]
do
var${i}="hello${i}"
echo "${var}${i}"
i=`expr ${i} + 1`
done
아래와 같이 출력을 얻고 싶습니다.
hello1
hello2
답변1
POSIX에서는 동적 이름을 가진 변수를 사용해야 sh
합니다 .eval
i=0
while [ "$i" -le 3 ]
do
eval '
var'"$i"'="hello${i}"
echo "var$i = ${var'"$i"'}"
'
i=$((i+1))
done
echo "${var1}"
를 사용할 때 eval
확장해야 하는 변수만 에 전달된 인수에서 확장되는지 확인하는 것이 중요합니다 eval
(그리고 해당 값이 삭제되었는지(여기서는 안전한 십진수 시퀀스임을 알 수 있음)).
$i
위에서는 그 중 두 개만 확장되었습니다 . 이를 위해 작은(강한) 따옴표를 제거하고 $i
내부 큰따옴표를 삽입합니다: eval '...'"$i"'...'
.
정확하게 인용하기가 어렵고(올바르게 인용하지 않으면 위험하므로) eval
최대한 사용을 제한하는 것이 가장 좋습니다. 이상적으로는 동적 변수의 내용만 정적 변수로 전송하거나 그 반대로 전송하는 것이 좋습니다. 예를 들면 다음과 같습니다.
i=0
while [ "$i" -le 3 ]
do
var=hello$i # $var with static name
eval "var$i=\$var" # transfer into variable with dynamic name
echo "var$i = $var" # use var with static name instead of dynamic one
# everywhere else (for which we don't need eval)
i=$((i+1))
done
echo "${var2}"
/// 대신 배열(또는 , 또는 최신 버전의 연관 배열 ksh
) zsh
을 사용할 bash
수 있습니다 . 배열 인덱스는 / 에서 시작 하고 배열 은 희박합니다(양의 정수로 제한된 키를 가진 연관 배열과 비슷함). 반면 다른 모든 셸(Bourne과 같은 프런트엔드 포함)에서는 인덱스 가 1에서 시작하고 배열은 일반입니다. 정렬.yash
ksh93
zsh
bash
ksh
bash
0
zsh
yash
존재하다 ksh
/ bash
/ zsh -o ksharrays
:
unset -v var
i=0; while [ "$i" -le 3 ]; do
var[i]=hello$i
echo "var[$i]=${var[i]}"
i=$((i+1))
done
echo "${var[1]}"
또는 // 일반적인 POSIX 구문의 ((...))
또 다른 확장을 사용하세요.sh
ksh
zsh
bash
unset -v var
i=0; while ((i <= 3)); do
var[i]=hello$i
echo "var[$i]=${var[i]}"
((++i))
done
echo "${var[2]}"
ksh93
또는 , bash
, 사용 zsh -o ksharrays
:
unset -v var
for ((i = 0; i <= 3; i++)); do
var[i]=hello$i
echo "var[$i]=${var[i]}"
done
echo "${var[3]}"
답변2
루프를 사용하는 것이 훨씬 쉽습니다 for
.
for i in 1 2 3; do
echo var$i\ =\ hello$i
done
에서 테스트되었습니다 bash
.