シェルスクリプトがたくさん見えます(例:これ)変数が存在することを確認してください。たとえば、次のようになります。
[ -n "${VAR-}" ]
私が知っている限り、変数の有無(または)を確認するときにaを提供しない型を使用する${VAR-fallback}
ことは意味がありません。同じだ。たとえば、設定されていない変数の場合fallback
-n
-z
${VAR:-fallback}
unset VAR
[ -z "$VAR" ] &&
[ -z "${VAR-}" ] &&
[ -z "${VAR:-}" ] &&
echo True # => True
そして空の変数として
VAR=
[ -z "$VAR" ] &&
[ -z "${VAR-}" ] &&
[ -z "${VAR:-}" ] &&
echo True # => True
しかし、尋ねたいほど多くの場所でそれを見ることができます。私が何かを見逃しているのでしょうか?これは誤用につながる誤解ですか、それとも実際の理由はありますか?
答え1
set -u
有効ですがVAR
設定されていない場合は[ -z "$VAR" ]
エラーが発生します。[ -z "${VAR-}" ]
デフォルト値を使用すると、設定されていない変数の使用に関する確認は無視され、エラーは発生しません。
答え2
${VAR:-}
あなたの言葉は絶対に正しいです。そのテーブルまたはorでテーブルを使用する理由はありません。${VAR-}
test -n
test -z
私はこれを直接見たことがないので、経験のないシェルプログラマーがどう思うか推測できます。未設定価値と空どのように機能するかはtest -n
価値がありますが、これは組み込みで欠陥がある場合、または誰かがその意味を考慮せずに使用しようとした後にそのように守る場合test
にのみ発生します。[
set -u