bashのif [...とtest ...お問い合わせの違い

bashのif [...とtest ...お問い合わせの違い

以下を考慮してください。

echo "hello" > file.txt
is_match1 () {
  local m
  m=$(cat "file.txt" | grep -F "$1")
  if [ -z "$m" ]; then
    return 1
  fi
}
is_match2 () {
  local m
  m=$(cat "file.txt" | grep -F "$1")
  test -z "$m" && return 1
}
is_match1 "hello"
echo "$?"
0
is_match2 "hello"
echo "$?"
1

なぜis_match21を返すのですか?

答え1

質問の状況に応じて、m両方の機能の値を取得します。hello

今見て

test -z "$m" && return 1

ここで何が起こっているのですか?テスト-z間違った、正しいですか?したがってreturn 1、実行されません。代わりに、関数は何を返しますか?各関数が$?最後に返す値です。この場合、値はリストの結果である1です&&

テストしたいのは

if [ -z "$m" ]; then return 1; fi

比較する

if test -z "$m"; then return 1; fi

ifNULL でない場合、文の分岐は実行されなかったため、2 つの文の終了状態は 0 です。$m

~からPOSIX規格:

コマンドの終了状態は、実行または複合リストの終了if状態でなければならず、実行されていない場合は0でなければなりません。thenelse


次の2つの機能を圧縮できます。

is_match () {
    grep -q -F -e "$1" file.txt
}

ここでは、grep呼び出し側に終了ステータスを提供します。また、一致するものが見つかったら終了するので、必ずしもfile.txtファイルを最後まで読み取る必要はありません。grep -q

関連情報