Ich schreibe ein Shell-Skript und versuche zu überprüfen, ob die Ausgabe eines Befehls eine bestimmte Zeichenfolge enthält. Ich denke, ich muss wahrscheinlich grep verwenden, bin mir aber nicht sicher, wie. Weiß jemand?
Ich schreibe ein Shell-Skript und versuche zu überprüfen, ob die Ausgabe eines Befehls eine bestimmte Zeichenfolge enthält. Ich denke, ich muss wahrscheinlich grep verwenden, bin mir aber nicht sicher, wie. Weiß jemand?
Antworten:
Testen Sie den Rückgabewert von grep:
./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
echo "matched"
fi
was idiomatisch so gemacht wird:
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
und auch:
./somecommand | grep -q 'string' && echo 'matched'
=
ein Vergleichsoperator sein, nicht ==
; siehe pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
grep 'string' &>/dev/null
ist sowohl nicht-POSIX - kompatibel und wesentlich langsamer ausgeführt werden soll (wenn string
erscheint früh in einem langen Ausgabestrom) als grep -q string
. [Die Einschränkung, die es gibt, wenn Sie sicher sein möchten, dass somecommand
sie auch nach dem Senden weiterläuft string
. In diesem Fall kann die Verwendung grep -q
- durch Schließen des Standards und Beenden nach dem ersten Auftreten von - string
kontraproduktiv sein]. (Betreff: "Nicht POSIX-kompatibel" &>
ist eine Erweiterung - siehe pubs.opengroup.org/onlinepubs/009695399/utilities/…, in der die von POSIX vorgeschriebene Umleitungsunterstützung beschrieben wird.)
Testen $?
ist ein Anti-Muster
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
grep -Fxq
F steht für fest (nicht interpretiert) und x für die gesamte Zeile
$?
Anti-Pattern?
$?
die vorhergehenden Befehle nicht für die Zwecke set -e
oder den ERR
Trap als "aktiviert" festgelegt , sodass Ihr Programm in Fällen beendet werden kann, in denen es später einfach den absichtlich falschen Pfad zurückgeben soll. Zum anderen $?
ist der globale Staat volatil - es ist leicht, seinen Wert versehentlich wegzuwerfen. Wenn Sie beispielsweise eine Protokollierungszeile wie hinzufügen echo "Exit status is $?"
, wird der neue Wert in $?
zum Exit-Status von echo
.
Eine andere Möglichkeit besteht darin, die Befehlsausgabe auf Übereinstimmung mit regulären Ausdrücken zu überprüfen.
Beispielsweise:
[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"
Ein sauberes if / else-bedingtes Shell-Skript:
if ./somecommand | grep -q 'some_string'; then
echo "exists"
else
echo "doesn't exist"
fi