以下を考慮してください。
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_match2
1を返すのですか?
答え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
if
NULL でない場合、文の分岐は実行されなかったため、2 つの文の終了状態は 0 です。$m
~からPOSIX規格:
コマンドの終了状態は、実行または複合リストの終了
if
状態でなければならず、実行されていない場合は0でなければなりません。then
else
次の2つの機能を圧縮できます。
is_match () {
grep -q -F -e "$1" file.txt
}
ここでは、grep
呼び出し側に終了ステータスを提供します。また、一致するものが見つかったら終了するので、必ずしもfile.txt
ファイルを最後まで読み取る必要はありません。grep -q