다음과 같은 루프에서 다른 이름을 가진 파일 집합을 처리하기 위해 쉘 스크립트에서 동적 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