변수를 배열 이름의 일부로 사용하시나요?

변수를 배열 이름의 일부로 사용하시나요?

예를 들어, 기본적으로 반복하는 변수가 i알파벳의 각 문자를 사용하는 for 루프가 있습니다. 각 값을 사용하여 이름이 지정된 (예: , , 등 ) i배열을 만들 거나 그냥 호출 하고 싶습니다 (그래서 배열을 , , , 등으로 호출할 수 있음)."$i"arrayaarraybarraycarraydarray"$i"abcd

이를 달성하기 위해 어떤 구문을 사용할 수 있습니까?

나는 시도했다:

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별도의 쉘이 시작되므로 첫 번째 쉘에서는 변수 세트를 사용할 수 없습니다.

관련 정보