Bash - FOR [duplicate]를 사용하여 숫자 접미사가 있는 변수를 반복하는 방법

Bash - FOR [duplicate]를 사용하여 숫자 접미사가 있는 변수를 반복하는 방법

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

관련 정보