Seltsames Verhalten mit grep -q in einem Bash-Skript

Seltsames Verhalten mit grep -q in einem Bash-Skript

Ich versuche, ein kleines Bash-Skript zu schreiben, das überprüft, ob jedes Element einer Zahlenfolge in einer bestimmten Datei enthalten ist, und diejenigen ausgibt, bei denen dies nicht der Fall ist.

find_missing.sh:

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

Zahlen.txt:

1
2
5

Erwartete Ausgabe:

3
4

Tatsächliche Ausgabe:

1
2
3
4
5

Wenn ich die Zeile grep -q "$num" numbers.txtin ändere grep "$num" numbers.txt, erhalte ich die erwartete Ausgabe. Nach meinem Verständnis sollte das -qFlag jedoch einen Exit-Code von 0 zurückgeben, wenn die Nummer gefunden wird, und einen Exit-Code von 1, wenn sie nicht gefunden wird, und ich verstehe nicht, warum es einen Unterschied macht, ob das Flag vorhanden ist oder nicht.

Wenn ich versuche, einzelne Instanzen des Grep-Befehls auszuführen, erhalte ich das erwartete Verhalten:

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

Kann mir jemand helfen zu verstehen, was hier vor sich geht?

Antwort1

$( ... )erfasst die Ausgabe, grep -qerzeugt aber keine Ausgabe. Verwenden Sie es nicht. Sie brauchen nicht einmal die eckigen Klammern, da ifSie den Beendigungsstatus verwenden können:

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

Sie erhalten die gleiche Ausgabe mit

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

verwandte Informationen