特定のプレフィックスが付いたすべての変数を一覧表示しようとしますが、プレフィックスが動的に決定されます。たとえば、
prefix=apple_
apple_one=a1
apple_two=a2
私が単にこれを行うと:
echo ${!apple_@}
apple_ で始まる変数名を取得できます。しかし、私は何らかの方法で変数プレフィックスを使ってこれをしたいと思います。私が試したすべての結果は間違った代替結果でした。たとえば、次の操作はできません。
echo ${!${prefix}@}
ベストアンサー1
Bashは入れ子になった変数拡張を解析しません。好きなようにできますeval
。つまり、シェルフラグメントを作成し、実行され${!apple_@}
たコマンドでそれを使用しますeval
。
prefix=apple_
eval 'vars=(${!'"$prefix"'@})'
有効な識別子文字のみを含める必要がありますprefix
。そうしないと、フラグメントから結果が生成されない可能性があります。
eval
通常、動的に計算された名前を持つ変数を使用する必要がありますが、この特別な場合には同じことを行う全く異なる方法があります。まさに完成システムを使うことです。 Bashの完成システムはスクリプトを介して実行することもできます。組み込み関数は、compgen
1行に1つの完成をリストします。完成に改行文字を含めることができればあいまいですが、ここではそうではありません。ワイルドカードも含まれていないため、引用符のない単純な拡張出力を使用して分割できます。接頭辞に識別子に無効な文字が含まれている場合は何も出力されません。
vars=($(compgen -v "$prefix"))