Piszę skrypt powłoki i próbuję sprawdzić, czy dane wyjściowe polecenia zawierają określony ciąg. Myślę, że prawdopodobnie muszę użyć grep, ale nie jestem pewien jak. Czy ktoś wie?
Piszę skrypt powłoki i próbuję sprawdzić, czy dane wyjściowe polecenia zawierają określony ciąg. Myślę, że prawdopodobnie muszę użyć grep, ale nie jestem pewien jak. Czy ktoś wie?
Odpowiedzi:
Przetestuj zwracaną wartość grep:
./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
echo "matched"
fi
co jest wykonywane idiomatycznie, jak to:
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
i również:
./somecommand | grep -q 'string' && echo 'matched'
=bycia operatorem porównania, a nie ==; patrz pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
grep 'string' &>/dev/nulljest niezgodny z POSIX i znacznie wolniejszy do wykonania (jeśli stringpojawia się wcześnie w długim strumieniu wyjściowym) niż grep -q string. [Zastrzeżenie polega na tym, że jeśli chcesz mieć pewność, somecommandże działa nawet po wyemitowaniu string, w takim przypadku użycie grep -q- poprzez zamknięcie standardowego wejścia i wyjście po pierwszym wystąpieniu string- może przynieść efekt przeciwny do zamierzonego]. (Re: "niezgodne z POSIX", &>to rozszerzenie - patrz pubs.opengroup.org/onlinepubs/009695399/utilities/ ... opisujące obsługę przekierowań narzuconych przez POSIX).
Testowanie $?jest anty-wzorcem
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
grep -Fxq F oznacza stałe (nie interpretować) i X na całej linii
$?jest anty-wzorcem?
$?nie ustawia poprzednich poleceń jako „sprawdzonych” dla celów set -elub ERRpułapki, więc twój program może zakończyć się w przypadkach, gdy chcesz, aby po prostu powrócił później celowo fałszywą ścieżką. Po drugie, $?to niestabilny stan globalny - łatwo przez przypadek wyrzucić jego wartość. Na przykład, jeśli dodasz wiersz logowania, taki jak echo "Exit status is $?", nowa wartość w stanie $?się statusem wyjścia echo.
Inną opcją jest sprawdzenie zgodności wyrażeń regularnych w wyniku polecenia.
Na przykład:
[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"
Czysty warunkowy skrypt powłoki if / else:
if ./somecommand | grep -q 'some_string'; then
echo "exists"
else
echo "doesn't exist"
fi