while 루프에서 변수를 동적으로 사용하는 방법

while 루프에서 변수를 동적으로 사용하는 방법

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에서 시작하고 배열은 일반입니다. 정렬.yashksh93zshbashkshbash0zshyash

존재하다 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 구문의 ((...))또 다른 확장을 사용하세요.shkshzshbash

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.

관련 정보