次のような結果があるとします。
a=(1 2 3 4)
b=a
私はaの長さをbとして取得したいと思います。 1つの方法は次のとおりです。
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[@]}"