다음과 같은 결과가 있다고 가정합니다.
a=(1 2 3 4)
b=a
나는 a의 길이를 b로 얻고 싶습니다. 한 가지 방법은 다음과 같습니다.
a=(1 2 3 4)
b="a[@]"
c=("${!b}")
echo ${#c[@]}
하지만 추가 변수가 없는 솔루션이 있는지 알아보고 싶습니다.
답변1
레코드로서 zsh
s에 해당하는 내용은 다음과 같습니다(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[@]}"