Bash는 목록을 변수로 사용하여 간접 변수 확장의 길이를 얻습니다.

Bash는 목록을 변수로 사용하여 간접 변수 확장의 길이를 얻습니다.

다음과 같은 결과가 있다고 가정합니다.

a=(1 2 3 4)
b=a

나는 a의 길이를 b로 얻고 싶습니다. 한 가지 방법은 다음과 같습니다.

a=(1 2 3 4)
b="a[@]"
c=("${!b}")
echo ${#c[@]}

하지만 추가 변수가 없는 솔루션이 있는지 알아보고 싶습니다.

답변1

레코드로서 zshs에 해당하는 내용은 다음과 같습니다(csh에서와 같이 작성할 수도 있음).bash${!b}${(P)b}${#array[@]}$#array

$ a=(1 2 3 4) b=a
$ echo ${(P)#b}
4

에서 간접 참조를 bash정말로 사용하고 싶다면 ${!b}언제든지 다음을 수행할 수 있습니다.

$ a=(1 2 3 4)
$ b='b[(b=${#a[@]}),0]'
$ echo "${!b}"
4

동일한 트릭을 사용하여 변수를 다음 요소 수로 동적으로 확장할 수 있습니다 $a.

$ typeset -n b='x[(x=${#a[@]}),0]'
$ echo "$b"
4
$ a+=(more)
$ echo "$b"
5

( nameref가 자신을 참조하는 경우 불평 x대신에 사용됩니다 b).bash

또는 언제든지 다음을 사용할 수 있습니다 eval.

$ a=(1 2 3 4) b=a
$ eval 'echo "${#'"$b"'[@]}"'
4

답변2

간접변수의 경우 이렇게 해야 합니다.

namerefs(bash 4.3+)를 사용하면 다음을 수행할 수 있습니다.

a=(1 2 3 4)
declare -n b=a
echo "${#b[@]}"

관련 정보