bash スクリプトでの grep -q の奇妙な動作

bash スクリプトでの grep -q の奇妙な動作

一連の数字の各要素が指定されたファイル内にあるかどうかを確認し、含まれていない要素を出力する小さな bash スクリプトを作成しようとしています。

:: 検索:

#!/bin/bash
for num in {1..5}; do
    if ! [[ $(grep -q "$num" numbers.txt) ]]; then
        echo "$num"
    fi
done

数字.txt:

1
2
5

期待される出力:

3
4

実際の出力:

1
2
3
4
5

grep -q "$num" numbers.txtを に変更するとgrep "$num" numbers.txt、期待どおりの出力が得られます。ただし、私の理解では、フラグ-qは、番号が見つかった場合は終了コード 0 を返し、見つからない場合は終了コード 1 を返すはずであり、フラグの有無によって違いが生じる理由がわかりません。

grep コマンドの個々のインスタンスを実行しようとすると、期待どおりの動作が得られます。

grep -q "1" numbers.txt; echo "$?"
0
grep -q "3" numbers.txt; echo "$?"
1

ここで何が起こっているのか理解するのを手伝ってくれる人はいますか?

答え1

$( ... )出力をキャプチャしますが、grep -q出力は生成されません。使用しないでください。if終了ステータスを使用できるため、角括弧も必要ありません。

if ! grep -q "$num" numbers.txt ; then

同じ出力は次のようにも得られます。

printf '%s\n' {1..5} | grep -vwFf numbers.txt -

関連情報