예를 들어, 기본적으로 반복하는 변수가 i
알파벳의 각 문자를 사용하는 for 루프가 있습니다. 각 값을 사용하여 이름이 지정된 (예: , , 등 ) i
배열을 만들 거나 그냥 호출 하고 싶습니다 (그래서 배열을 , , , 등으로 호출할 수 있음)."$i"array
aarray
barray
carray
darray
"$i"
a
b
c
d
이를 달성하기 위해 어떤 구문을 사용할 수 있습니까?
나는 시도했다:
for i in ${alphabet[@]}; do
"$i"array[0]=0
done
배열 그룹이 있으면 다음을 수행하여 반복할 수 있습니까?
for i in ${alphabet[@]}; do
"$i"array[0]=1
done
답변1
귀하의 작업을 수행하기 위한 다른 방법(연관 배열을 통해)을 제안할 수 있습니까? 더 똑똑하고 더 수용 가능한 것 같습니다.
declare -A array
for i in ${alphabet[@]}; do
array[$i]=0
# or array[${i}0]=0 if you need
done
for i in ${!array[@]}
따라서 또는를 통해 동일한 방식으로 반복할 수 있습니다.for i in ${alphabet[@]}
답변2
eval
내장 함수를 사용하여 변수 이름을 계산할 수 있습니다. 예를 들면 다음과 같습니다.
i="a"
eval ${i}lphabet="abcde"
echo $alphabet
그러나 여기에서 값을 검색하려면 ${i}lphabet
또 다른 트릭이 필요합니다. 당신은 사용해야합니다값변수 이름으로서의 변수(본질적으로 포인터). 구문은 다음과 같습니다.
#declare a variable that names the other variable:
pointer=${i}lphabet
#dereference the name with the ! syntax:
echo ${!pointer}
귀하의 사례에 적용됩니다:
for i in ${alphabet[@]}; do
pointer="$i"array
eval ${pointer}[0]=0
done
그러나 이것은 나쁜 디자인입니다. 이 문제를 처리하는 보다 전통적인 방법을 찾아야 합니다.
답변3
eval
변수의 내용을 변수 이름으로 사용해야 합니다 .
for i in ${alphabet[@]}; do
eval "$i[0]=1"
done
eval
인수를 가져와서 쉘의 컨텍스트에서 평가하면(예: 별도의 쉘이 아닌) 이를 시도하면 eval
별도의 쉘이 시작되므로 첫 번째 쉘에서는 변수 세트를 사용할 수 없습니다.