새 변수 이름을 동적으로 생성하는 방법

새 변수 이름을 동적으로 생성하는 방법

다음과 같은 루프에서 다른 이름을 가진 파일 집합을 처리하기 위해 쉘 스크립트에서 동적 var 이름을 생성하려고 합니다.

SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo SAMPLE{$i}
done

나는 출력을 기대합니다 :

1-first.with.custom.name
2-second.with.custom.name

하지만 나는 다음을 얻습니다.

SAMPLE{1}
SAMPLE{2}

var 이름을 동적으로 생성할 수 있습니까?

답변1

배열을 사용하지 않는 이유는 비슷한 작업을 수행하는 데 사용됩니다.

sample[1]='1-first.with.custom.name'
sample[2]='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo ${sample[$i]}
done

또한 예약된 변수 이름이 실수로 사용되는 것을 방지하려면 스크립트에서 변수 이름을 모두 대문자로 사용하지 마십시오.

답변2

다음과 같이 예상되는 결과를 얻을 수 있음을 발견했습니다.

for (( i = 1; i <= 2; i++ ))
do
  NEW_NAME=SAMPLE$i
  echo ${!NEW_NAME}
done

답변3

이를 수행하기 위해 이식 가능한 POSIX 표준 셸을 사용하고 배열과 같은 bash 확장 사용을 피하려면 eval을 사용해야 합니다.

$ foo1='a b c'
$ foo2='d e f'
$ a=1; eval echo \$foo$a
a b c
$ a=2; eval echo \$foo$a
d e f

관련 정보