関数パラメータの値がnullの場合は終了する小さな関数を作成しましたが、可能であれば(値の代わりに)パラメータの名前も印刷できるようにしたいが、次の実装では名前を印刷しません。パラメータの
function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${!1} is empty"
exit 1
fi
}
このように呼び出すと
exitIfEmpty someKey
印刷する必要がある
Exiting because someKey is empty
答え1
関数に渡されるのは文字列だけです。実行するとfunc somevar
文字列が渡されますsomevar
。 runの場合、func $somevar
変数の(噴射)値が渡されますsomevar
。変数参照、ポインタ、または同様のものではなく、文字列にすぎません。
合格したい場合名前変数を関数に変換して表示する値変数には、nameref(Bash 4.3以降、IIRC)または間接参照を使用する必要があります${!var}
。${!var}
に名前が格納されている変数の値を展開しますvar
。
そのため、スクリプトで誤った方法で使用しています。変数名を関数に渡す場合は、次のように取得し"${!1}"
ます。値$1
Plain に名前が付けられた変数の合計は"$1"
次のとおりです。名前。
たとえば、次のように印刷し、variable bar is empty, exiting
シェルを終了します。
#!/bin/bash
exitIfEmpty() {
if [ -z "${!1}" ]; then
echo "variable $1 is empty, exiting"
exit 1
fi
}
foo=x
unset bar
exitIfEmpty foo
exitIfEmpty bar
答え2
名前を2番目の引数として渡す
function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${2} is empty"
exit 1
fi
}
exitIfEmpty "$someKey" someKey
答え3
echo "Exiting because \$1 is empty"
これで問題が解決します。