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/null
jest niezgodny z POSIX i znacznie wolniejszy do wykonania (jeśli string
pojawia 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 -e
lub ERR
puł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