Dans le cadre de ce script, je dois être en mesure de 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 la if
déclaration, mais pas comment l'utiliser grep
dans un script. Je comprends que ça grep
va ressembler à quelque chose comme ça
grep ^$1 schemas.txt
Je pense que cela devrait être beaucoup plus facile que je ne le fais.
Je reçois une erreur "trop d'arguments" sur la if
déclaration. Je me suis débarrassé de l'espace entre les deux grep -q
puis j'ai obtenu une erreur d'opérateur binaire.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
[
…]
et ça va marcher. Bien que vous souhaitiez probablement citer votre modèle:if grep -q "^$1" schemas.txt; then …
Réponses:
grep
renvoie un code de sortie différent s'il a trouvé quelque chose (zéro) ou s'il n'a rien trouvé (différent de zéro). Dans uneif
instruction, un code de sortie zéro est associé à "true" et un code de sortie différent de zéro à false. De plus, grep a un-q
argument pour ne pas afficher le texte correspondant (mais ne renvoyer que le code de statut de sortie)Donc, vous pouvez utiliser grep comme ceci:
Pour faire vite, quand vous faites quelque chose comme
if [ -z "$var" ]…
ça, il s’avère que[
c’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,[
retourne un code de sortie zéro pour true, un code de sortie non nul pour false. (test
est la même chose que[
, sauf pour la fermeture]
)la source
ls -l /usr/bin/\[
etman [
voyez qu’il[
s’agit d’un programme comme un autre, cela ressemble à un élément syntaxique - cela devrait le rendre évident et plus facile à comprendre. (pour plus de commodité,[
est également intégré à bash, dash et autres - mais cela reste une commande). essayez aussitype -all [
en bash.-q
option, cette option indique à grep d'être silencieuse (ne pas imprimer les lignes correspondantes).Un autre moyen simple consiste à utiliser
grep -c
.Cela renvoie (pas comme code de sortie) le nombre de lignes correspondant au modèle, donc 0 s'il n'y a pas de correspondance ou 1 ou plus s'il y a correspondance.
Donc, si vous voulez vérifier que le motif correspond 3 fois ou plus, vous ferez:
la source
grep -cim1
plutôt.Je sais que je suis en retard pour ça, mais j'adore cette version courte:
la source
Si nous voulons intercepter le premier mot d'un fichier, nous devons ajouter
-zw
à grepSans
-z
nous obtenons le premier mot d'une ligne. Sans-w
nous avons des mots partiels.la source
Si vous voulez l’utiliser avec des crochets, vous pouvez exécuter ce qui suit
Cette logique fonctionne pour toutes les commandes, il suffit de placer vos commandes à l'intérieur de la pioche en arrière (le bouton au-dessus de l'onglet ou au bas des boutons Echap ou à gauche du 1 bouton)
la source
`grep -q PATTERN file.txt`
, sinon l'opérateur split + glob est appliqué et cela poserait problème pour toute sortie contenant des caractères$IFS
ou des caractères génériques. Plus généralement,[ "`cmd`" ]
renverrait true sicmd
génère au moins une ligne non vide sur stdout (avec des problèmes potentiels si les octets NUL sont générés). Cela signifie que le shell devra stocker la totalité de la sortie en mémoire et attendre la fin. Utiliserif cmd | grep -q .
plutôt peut être préférable à cet égard.-q
commutateur est de supprimergrep
la sortie. Vous dites: Recherchez PATTERN dans le fichier file.txt, supprimez toute sortie, puis définissez le statut de retour en fonction de la présence de PATTERN. Ensuite, ignorez le statut de retour, prenez le résultat de la commande (que nous avons forcé à être vide), appliquez le fractionnement des mots et le développement du fichier dans le fichier (ne générant aucun argument), puis exécutez la commande[
(akatest
) avec exactement un argument - à savoir ,]
--et ensuite, puisque cela entraînera une erreur, echo "non trouvé". @ StéphaneChazelas, ai-je oublié quelque chose?-q
. Ce commentaire aurait eu du sens[ `grep PATTERN file.txt ` ]
, mais comme le suggère le commentaire, il[ "`grep -n PATTERN file.txt`" ]
serait préférable que PATTERN ne fasse correspondre que des lignes vides. Bien que ici bien sûr c'estif grep -q PATTERN file.txt
ce que vous voulez.