Sto scrivendo uno script di shell e sto cercando di verificare se l'output di un comando contiene una determinata stringa. Penso che probabilmente dovrò usare grep, ma non sono sicuro di come. Qualcuno sa?
Sto scrivendo uno script di shell e sto cercando di verificare se l'output di un comando contiene una determinata stringa. Penso che probabilmente dovrò usare grep, ma non sono sicuro di come. Qualcuno sa?
Risposte:
Verifica il valore restituito da grep:
./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
echo "matched"
fi
che è fatto idiomaticamente in questo modo:
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
e anche:
./somecommand | grep -q 'string' && echo 'matched'
=
di essere un operatore di confronto, non ==
; vedi pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
grep 'string' &>/dev/null
è sia non conforme a POSIX che molto più lento da eseguire (se string
appare all'inizio in un flusso di output lungo) rispetto a grep -q string
. [L'avvertenza che c'è se vuoi essere sicuro che somecommand
continui a funzionare anche dopo l'emissione string
, nel qual caso l'uso grep -q
- chiudendo il suo stdin ed uscendo dopo che la prima istanza di string
è stata vista - può essere controproducente]. (Oggetto: "non conforme a POSIX", &>
è un'estensione - vedere pubs.opengroup.org/onlinepubs/009695399/utilities/… che descrive il supporto di reindirizzamento richiesto da POSIX).
Il test $?
è un anti-pattern
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
grep -Fxq
F sta per fisso (non interpretato) ex per l'intera linea
$?
è anti-pattern?
$?
non imposta i comandi precedenti come "controllato" ai fini di set -e
o la ERR
trappola, in modo che il programma possa uscire nei casi in cui si desidera per tornare semplicemente lungo il sentiero intenzionalmente-falso in seguito. Dall'altro, $?
è uno stato globale volatile: è facile buttare via il suo valore per sbaglio. Ad esempio, se aggiungi una riga di registrazione simile echo "Exit status is $?"
, il nuovo valore in $?
diventa lo stato di uscita di echo
.
Un'altra opzione è controllare la corrispondenza delle espressioni regolari sull'output del comando.
Per esempio:
[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"
Uno script di shell condizionale if / else pulito:
if ./somecommand | grep -q 'some_string'; then
echo "exists"
else
echo "doesn't exist"
fi