내 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이 표시되고 원래 배열에서 실제 숫자나 요소가 표시됩니다. 두 경우 모두 기본적으로 새 배열을 만듭니다.