ファイルに「mail」という文字列が含まれているかどうかをテストする必要があるとします。 2つの文字列の違いは何ですか?
if grep -q "mail" "file"; then ...
if [ $( grep -l "mail" "file") ]; then ...
[ grep -l "mail" "file" ] && ..
これらに違いはありますか?それとも全体的に同じですか?
答え1
if command; then ...
評価の終了状態ですcommand
。 0は成功を示します(条件がtrueと評価されます)。
まず:[
とほぼ同じであるため、文字列はその構文に準拠するとtest
予想しています。command
if [ $(command) ]; then ...
出力を含む文字列を計算しますcommand
。ほとんどの場合動作しません。以下の例をご覧ください。
[ command ] && ..
grep -l "mail" "file"
次のように説明します。
grep
- 文字列-l
- 単項演算子は、次の文字列の長さを返します。"mail"
-l
- 演算子に引数として渡される文字列"file"
- 文字列
実装によって若干異なるエラーが発生します。これは、[
演算子なしで文字列、数字、その他の文字列で構成されるシーケンスを評価する必要があるためです。デフォルトで[
は(および)はシェル組み込みで、test
エラーメッセージをスタンドアロンバイナリ(通常は/bin/[
または)と/usr/bin/[
比較できます。