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.txt
in ändere grep "$num" numbers.txt
, erhalte ich die erwartete Ausgabe. Nach meinem Verständnis sollte das -q
Flag 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 -q
erzeugt aber keine Ausgabe. Verwenden Sie es nicht. Sie brauchen nicht einmal die eckigen Klammern, da if
Sie 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 -