J'écris un script shell et j'essaie de vérifier si la sortie d'une commande contient une certaine chaîne. Je pense que je dois probablement utiliser grep, mais je ne sais pas comment. Est-ce que quelqu'un sait?
J'écris un script shell et j'essaie de vérifier si la sortie d'une commande contient une certaine chaîne. Je pense que je dois probablement utiliser grep, mais je ne sais pas comment. Est-ce que quelqu'un sait?
Réponses:
Testez la valeur de retour de grep:
./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
echo "matched"
fi
ce qui se fait de manière idiomatique comme ceci:
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
et aussi:
./somecommand | grep -q 'string' && echo 'matched'
=
d'être un opérateur de comparaison, non ==
; voir pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
grep 'string' &>/dev/null
est à la fois non conforme à POSIX et beaucoup plus lent à exécuter (s'il string
apparaît au début d'un long flux de sortie) que grep -q string
. [La mise en garde qu'il y a si vous voulez être sûr de somecommand
continuer à fonctionner même après l'émission string
, auquel cas l'utilisation grep -q
- en fermant son stdin et en sortant après que la première instance de string
est vue - peut être contre-productive]. (Re: "non-compatible POSIX", &>
est une extension - voir pubs.opengroup.org/onlinepubs/009695399/utilities/... décrivant le support de redirection mandaté par POSIX).
Le test $?
est un anti-pattern
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
grep -Fxq
F signifie fixed (non interprété) et x pour toute la ligne
$?
anti-pattern?
$?
ne définit pas les commandes précédentes comme "vérifiées" pour les besoins de set -e
ou du ERR
piège, de sorte que votre programme peut quitter dans les cas où vous souhaitez simplement qu'il retourne simplement le chemin intentionnellement faux plus tard. D'autre part, $?
c'est un état mondial volatil - il est facile de perdre sa valeur par accident. Par exemple, si vous ajoutez une ligne de journalisation comme echo "Exit status is $?"
, la nouvelle valeur dans $?
devient l'état de sortie de echo
.
Une autre option consiste à vérifier la correspondance des expressions régulières sur la sortie de la commande.
Par exemple:
[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"
Un script shell conditionnel propre if / else:
if ./somecommand | grep -q 'some_string'; then
echo "exists"
else
echo "doesn't exist"
fi