正直なところ、この質問をどのようにすべきか、正しい用語が何であるかもしれません。
だから私がしたいのは、変数名を持つ変数を扱うことです。実際に見せることで最もよく説明できるようです。以前私が持っていたのはこれでした。
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ループで繰り返す項目の間にカンマはありません。
答え2
このコードはうまくいきます。 file_var または pw_var が空の場合、特定の変数が空であると印刷します。ユースケースに合わせて調整できます。
file_var=""
pw_var=""
for i in 'file_var' 'pw_var';do
if [ -z ${!i} ]; then
echo "$i is empty"
fi
done