-nが空の文字列を含む引用符で囲まれていない変数に対してtrueを返すのはなぜですか? [コピー]

-nが空の文字列を含む引用符で囲まれていない変数に対してtrueを返すのはなぜですか? [コピー]

からman bash

-n string
    True if the length of string is non‐zero.

例:

# expected
$ var=""; [ -n "$var" ]; echo $?
1

# unexpected?
$ var=""; [ -n $var ]; echo $?
0

-nここでは、空の文字列を含む引用符なしの変数がtrueを返すことがわかります。なぜ?

$varここで見積もりが必要なのはなぜですか?

答え1

$記号は、パラメータ拡張、コマンド置換、または算術拡張を紹介します。

2番目の場合($var引用符なし)$varは空であるため、nullに展開されます。テストにオペランドを指定しなかったのと同じです。

最初のケース($var二重引用符)は、$var二重引用符内の内容を除くすべての項目に展開されます。これは偶然に空の文字列を""テストのオペランドとして提供します。


アップデート内容は次のとおりです。コメントにOPの追加質問:

オペランドなしで-nを実行すると、「エラー:-nにはオペランドが必要です」が発生しないのはなぜですか?

これに対する私の最初の答えは次のとおりです。手動、テスト

状態0(true)または1(false)で終了

エラーには、次の状況が含まれます。「間違った引数が与えられました」

一部イルカチュウのコメントより深い洞察を提供します。

いくつかのテスト実装(Bashを含む)は実際に明示的なエラー状態を返します。これはtrueの場合0、falseの場合1、エラーの場合2です。

しかし:

シェル条件に関する限り、1と2は両方とも偽です。

関連情報