[ -n ]が[ -n "" ]のように偽ではないのはなぜですか?

[ -n ]が[ -n "" ]のように偽ではないのはなぜですか?

私の質問は、このコードで生成された戻り値に関するものです。

if [ -n ]; then echo "true"; else echo "false"; fi

が印刷されますtrue

補足テストでも[ -z ]印刷を使用してくださいtrue

if [ -z ]; then echo "true"; else  echo "false"; fi

上記のコードで[ -n ]テストでは、渡された文字列値がまったくnullではないと仮定するのはなぜですか?

以下のコードはを印刷しますfalse。これは、渡された文字列値が空で長さがゼロであるために予想されます。

if [ -n "" ]; then echo "true"; else  echo "false"; fi

答え1

[ -n ]テストを使用しないでください-n

-ninは[ -n ]まったくテストではありません。[との間に引数が1つしかない場合、その引数]は文字列であり、空であることがテストされます。文字列に先行していても、-まだテストではなくオペランドとして解釈されます。文字列-nは空ではないため、2つの文字が含まれています-nいいえ0文字 - [ -n ]trueと評価されます。

〜のようにイグナシオ・バスケス・アブラムス、どこstringパラメータであり、テストは以下で実行されます。stringinはそれに対して行われたテストと同じです。いつ[ string ][ -n string ]string偶然にも-n特別なことは起こりません。 inと2番目のinは空であることをテストする文字列です-n[ -n ]-n[ -n -n ]

[andの間に引数が1つしかない場合、]その引数はテストと同じ名前が指定されていても常に空でないことをテストする文字列です。同様に、とその最初の引数の間に2つの引数がある場合、[2番目の引数はテストと同じ名前が指定されていても常に空でないことをテストする文字列です。これは、for構文がそれ以降の単一引数が文字列オペランドであると主張するためです。]-n[[]-n

同じ理由でテストを[ -n ]使用しないでください。テストを使用しないでください。-n[ -z ]-z


ヘルプを見ると、詳細について[学ぶことができます。bashこれは内蔵ケース:

$ type [
[ is a shell builtin

したがって、help [以下を実行して助けを得ることができます。

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

サポートされているテストと動作方法を含む詳細については、のヘルプを参照してくださいtest。コマンドを実行すると、help test詳細なリストが表示されます。以下は文字列演算子の一部です。これをすべて再現するわけではありません。

      -z STRING      True if string is empty.

      -n STRING
         STRING      True if string is not empty.

      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
      STRING1 < STRING2
                     True if STRING1 sorts before STRING2 lexicographically.
      STRING1 > STRING2
                     True if STRING1 sorts after STRING2 lexicographically.

-n STRING同じことを行います。STRING文字列がSTRING空でないことをテストします。

答え2

[X]等しい[ -nX]〜でもX-オペランドがなければ最初から始めます。

$ [ -o ] ; echo $?
0
$ [ -eq ] ; echo $?
0
$ [ -n -o ] ; echo $?
0
$ [ -n -eq ] ; echo $?
0

答え3

[ -n ][これはコマンド(またはtestコマンド)が次のように実行されるためです。数字与えられた引数。引数が1つだけ与えられ、引数が空でない文字列の場合、結果は「true」です。 "-n"は空でない2文字の文字列なので、"true"です。

関連情報