Bashの変数の動的置換

Bashの変数の動的置換

正直なところ、この質問をどのようにすべきか、正しい用語が何であるかもしれません。

だから私がしたいのは、変数名を持つ変数を扱うことです。実際に見せることで最もよく説明できるようです。以前私が持っていたのはこれでした。

if [ -z ${file_var} ]; then
        echo "empty argument"
fi
if [ -z ${pw_var} ]; then
        echo "empty argument"
fi

したがって、2つのifステートメントを使用する代わりに、次のように1つのforループのみを使用したいと思います。

for i in file_var, pw_var;do
        if [ -z ${${i}} ]; then
                echo "empty argument"
        fi
done

今、これは明らかにうまくいかないので、正しく実行する方法が疑問に思います。

ベストアンサー1

あなたがしたいことは間接拡張、Bashは以下をサポートします。!:

if [ -z "${!i}" ] ; then

最初の文字が次のような場合範囲は感嘆符( !)であり、範囲一つでもない名前参照、これは間接レベルを導入します。 Bash は残りを拡張して形成された値を使用します。範囲その後、新しい引数に展開され、その値は元の引数の拡張ではなく残りの拡張に使用されます。これは…間接拡張

この場合、"${!i}"変数のすべての値に展開されます。名前に保存され、間接i-zにアクセスされた値をテストします。


または名前参照自動的にこのように動作する特別な型の変数です。あなた以下を使用して nameref 変数を作成します。declare -n name、その後

へのすべての参照、割り当て、および属性の変更name(属性自体を使用または変更する場合を除く-n)は、値が参照する変数で行われますname

だから追加すると

declare -n i

ループの前に、これは次のことを意味します。

for i in file_var pw_var
do
    if [ -z "$i" ]
    then
    ...
    fi
done

希望の方法で動作します。しかし、参考にしてください仕事i(このようなループに設定するのとは対照的に)ターゲット変数を変更します。


forまた、質問に書いたように、Bashループで繰り返す項目の間にカンマはありません。

おすすめ記事