Bash 평가 배열 변수 이름

Bash 평가 배열 변수 이름

내 bash 예는 다음과 같습니다.

var첫 번째 경우에는 "alias " 를 사용하여 수행하려는 작업이 다음과 같습니다 myvarA.

myvarA="variableA"
varname="A"
eval varAlias=\$"myvar"$varname
echo $varAlias

배열 변수의 두 번째 경우와 해당 멤버에 대한 반복은 간단합니다.

myvarA=( "variableA1" "variableA2" )
for varItem in ${myvarA[@]}
do
    echo $varItem
done

이제 어떻게든 예제 1과 같은 "별칭" 기술을 사용해야 하지만 이번에는 배열 변수에 대해 다음과 같습니다.

eval varAlias=\$"myvar"$varname
for varItem in ${varAlias[@]}
do
    echo $varItem
done

myvarA그러나 마지막 경우에는 첫 번째 멤버만 인쇄됩니다. 즉, eval변수의 값이 평가됩니다. var 배열 변수가 다음 eval과 같이 평가 되도록 어떻게 처리해야 합니까?배열 변수의 이름아니요변수 값.

답변1

매개변수 확장의 가장 간단한 형태는 다음과 같습니다 ${parameter}.
혼란스러운 상황에서는 중괄호를 사용하는 것이 더 나은 접근 방식입니다.

"myvarA" 배열에 공백이 포함될 가능성을 고려하면 이것이 답이라고 생각합니다.

#!/bin/bash -x
myvarA=( "variable  A1" "variable  A2" )
varname="A"

eval varAlias=( '"${myvar'${varname}'[@]}"' )
eval varAlias=( \"\${myvar${varname}[@]}\" ) # both works
for varItem in "${varAlias[@]}" # double quote and `@' is needed
do
    echo "$varItem"
done

답변2

귀하의 답변에서는 varAlias배열이 아니므로 for varItem in $varAlias토큰화만 수행하면 됩니다. 따라서 원래 배열 요소에 공백이 포함되어 있으면 별도의 단어로 처리됩니다.

다음과 같이 스칼라 간접 참조를 수행할 수 있습니다 a=42; b=a; echo ${!b}.

다음과 같이 스칼라 배열에 간접적으로 액세스할 수 있습니다.

$ j=42; k=55; m=99
$ a=(j k m)
$ echo ${!a[1]}
55

불행하게도 수행하려는 배열 간접 참조를 수행하는 만족스러운 방법은 없습니다. 간접 참조가 필요하지 않도록 코드를 다시 작성할 수 있어야 합니다.

당신은 또한 볼 수 있습니다배쉬FAQ/006.

답변3

문제를 해결했습니다. 마지막 예는 다음과 같습니다.

eval varAlias=\${"myvar"$varname[@]}
for varItem in ${varAlias[@]}
do
    echo $varItem
done

답변4

위의 허용된 답변은 완전하지 않습니다. 실제 배열 할당을 수행하려면 원래 배열 주위에 괄호가 누락되어 있습니다. 그렇지 않으면 여전히 크기 1의 새 배열을 얻게 됩니다.

내 말은:

eval varAlias=\${"myvar"$varname[@]}

다음과 같이 변경되어야 합니다:

eval varAlias=(\${"myvar"$varname[@]})

두 가지 시나리오를 취하고 다음을 실행하여 이를 확인할 수 있습니다.

echo ${#varAlias[@]}

원래의 경우 대괄호 안에 1이 표시되고 원래 배열에서 실제 숫자나 요소가 표시됩니다. 두 경우 모두 기본적으로 새 배열을 만듭니다.

관련 정보