3

bash でテスト構文を間違えましたが、文字列チェックで実際に何が起こるかを理解したいと思い-nます-z. LINENUMから行番号を変数で取得するために、次の行を書きましたgrep。文字列が見つからない場合 (ファイル内に 1 つしかないことは確かです)、LINENUM変数は空です。

$ LINENUM=$(grep -w -n mystring myfile | cut -d: -f1)
$ echo --$LINENUM--
----
$ if [ -n $LINENUM ] ; then echo "Checked -n"; fi
Checked -n
$ if [ -z $LINENUM ] ; then echo "Checked -z"; fi
Checked -z

次に、二重引用符を忘れたことに気付き、次のチェックが表示されました。

$ if [ -n "$LINENUM" ] ; then echo "Checked -n"; fi
$ if [ -z "$LINENUM" ] ; then echo "Checked -z"; fi
Checked -z

したがって、以前のテストでは、二重引用符を忘れていましたが、 if テストでは何をチェックしたのに対し、-n-z?の両方から 2 つの肯定的なチェックを取得したためです。

4

1 に答える 1

4

引用符がなければ、テスト ステートメント (-Xここで表されるいずれかの演算子を使用) は次のようになります。

if [ -X ]; then echo "Checked -X"; fi

POSIX 標準によれtestば、引数が null でない場合、引数が 1 つの形式 (ここに表示されています) は true です。リテラル文字列-Xは null ではない (もはや演算子ではない) ため、true と評価されます。

引用符で、あなたは得る

if [ -X "" ]; then echo "Checked -X"; fi

引用符は空の 2 番目の引数を強制するため、2 引数形式のtest, and -X(-nまたは-z) は、2 番目の null 引数に作用する主要な演算子として適切に認識されます。

于 2013-05-03T12:49:31.990 に答える