Bash は、リストを変数として使用して、間接変数拡張の長さを取得します。

Bash は、リストを変数として使用して、間接変数拡張の長さを取得します。

次のような結果があるとします。

a=(1 2 3 4)
b=a

私はaの長さをbとして取得したいと思います。 1つの方法は次のとおりです。

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[@]}"

関連情報