から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は両方とも偽です。