Dans le cadre de ce script, je dois pouvoir vérifier si le premier argument donné correspond au premier mot du fichier. Si c'est le cas, quittez avec un message d'erreur; si ce n'est pas le cas, ajoutez les arguments au fichier. Je comprends comment écrire l'instruction if
, mais pas comment utiliser grep
dans un script. Je comprends que grep
ressemblera à ceci
grep ^$1 schemas.txt
Je pense que cela devrait être beaucoup plus facile que je ne le fais.
J'obtiens une erreur "trop d'arguments" sur l'instruction if
. Je me suis débarrassé de l'espace entre grep -q
, puis un opérateur binaire d'erreur est attendu.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
grep
renvoie un code de sortie différent s'il a trouvé quelque chose (zéro) vs s'il n'a rien trouvé (non nul). Dans une instruction if
, un code de sortie zéro est mappé sur "true" et un code de sortie non nul est mappé sur false. De plus, grep a un -q
argument pour ne pas sortir le texte correspondant (mais renvoyer uniquement le code d'état de sortie)
Donc, vous pouvez utiliser grep comme ceci:
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
En bref, lorsque vous faites quelque chose comme if [ -z "$var" ]…
, il se trouve que [
est en fait une commande que vous exécutez, tout comme grep. Sur mon système, c'est /usr/bin/[
. (Eh bien, techniquement, votre Shell l'a probablement intégré, mais c'est une optimisation. Il se comporte comme s'il s'agissait d'une commande). Cela fonctionne de la même manière, [
renvoie un code de sortie nul pour true, un code de sortie non nul pour false. (test
est la même chose que [
, à l'exception de la fermeture ]
)
Un autre moyen simple consiste à utiliser grep -c
.
Cela renvoie (pas de retour en tant que code de sortie), le nombre de lignes qui correspondent au modèle, donc 0 s'il n'y a pas de correspondance ou 1 ou plus s'il y a une correspondance.
Donc, si vous vouliez vérifier que le motif correspond 3 fois ou plus, vous feriez:
if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
...
Je sais que je suis en retard pour cela, mais j'aime cette version courte:
grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
Try () au lieu de [], fonctionnera. Même si vous n'utilisez pas de crochets, le code fonctionnera.
Si nous voulons attraper le premier mot d'un fichier, nous devons ajouter -zw
à grep
if grep -qzw "^$1" file
then
...
else
...
fi
Sans pour autant -z
nous obtenons le premier mot d'une ligne. Sans pour autant -w
nous obtenons des mots partiels.