J'ai eu une brutalité absolue de faire quelque chose qui devrait être assez simple.
J'ai essayé tout ce que je pouvais penser au cours des dernières heures, mais je n'arrive pas à le faire fonctionner. La tentative la plus récente est ici
Est-ce que quelqu'un a des suggestions?
if [[ $(grep -q 10.212.5.5 /etc/dhcp/dhcpd.conf) == 0 ]] && [[ $(grep -q 10.212.5.15} /etc/dhcp/dhcpd.conf) == 0 ]] && [[ $(grep -q 10.212.5.5 file1) == 0 ]] && [[ $(grep -q 10.212.5.5 file2) == 0 ]] ; then echo "notfound" ; fi
$()
renvoie le contenu de la commande - pas le code de sortie du fichiergrep
que vous espériez. Je voudrais transformer cela en unefor
boucle pour éviter autant de dactylographie répétée.Réponses:
Les commandes (par exemple
grep
) renvoient généralement deux types de résultats différents: la sortie (ce qu’elles impriment en cours d’exploitation) et un état de sortie (mieux considéré comme un succès ou un échec). Comme le signalait les poussins, la$(somecommand)
construction du shell capture le résultat de la commande, pas son statut de sortie; maisgrep
l'-q
option l'empêche de produire une sortie,$( )
finit donc par ne rien capturer .Je vois deux façons simples de résoudre ce problème (à condition que je comprenne ce que vous essayez de faire). La première consiste à utiliser à la
grep -c
place de-q
, afin d'indiquer le nombre de correspondances trouvées. Vous pouvez capturer ce résultat avec$( )
et le comparer à 0, exactement comme vous le faites (bien que j'ai enveloppé les lignes pour des raisons de lisibilité):L'autre option est d'utiliser
grep -q
, mais regardez son statut de sortie. Vérifier l'état de sortie d'une commandeif
est trivial - utilisez simplement la commande elle-même comme condition de test. Mais dans ce cas, c’est un retour en arrière, puisquegrep
renvoie succès si le motif est trouvé et échec s’il ne l’est pas; vous voulez que le test réussisse s'il n'a pas été trouvé, utilisez donc!
pour inverser le statut:la source