J'ai commencé à apprendre le Bash il y a quelques jours.
J'essaie d'obtenir un statut de sortie d' grep
expression dans une variable comme celle-ci:
check=grep -ci 'text' file.sh
et la sortie que j'ai obtenue est
No command '-ic' found
Dois-je le faire avec une commande pipe?
bash
shell
command-line
grep
exit-status
omri gilhar
la source
la source
$?
juste après la fin de la commande.Réponses:
Votre commande,
sera interprété par le shell comme "exécutez la commande
-ci
avec les argumentstext
etfile.sh
, et définissez la variablecheck
sur la valeurgrep
dans son environnement".Le shell stocke la valeur de sortie de la dernière commande exécutée dans la variable
?
. Vous pouvez affecter sa valeur à l'une de vos propres variables comme ceci:Si vous souhaitez agir sur cette valeur, vous pouvez soit utiliser votre
check
variable:ou vous pouvez sauter en utilisant une variable distincte et avoir à inspecter
$?
tous ensemble:(notez le
-q
, il indiquegrep
de ne rien produire et de sortir dès que quelque chose correspond; nous ne sommes pas vraiment intéressés par ce qui correspond ici)Ou, si vous voulez simplement "faire des choses" lorsque le motif n'est pas trouvé:
L'enregistrement
$?
dans une autre variable n'est nécessaire que si vous devez l'utiliser plus tard, lorsque la valeur de$?
a été remplacée, comme dansDans l'extrait de code ci-dessus,
$?
sera remplacé par le résultat du[ "$err" -ne 0 ] && [ ! -d "$dir" ]
test. L'enregistrer ici n'est vraiment nécessaire que si nous devons l'afficher et l'utiliser avecexit
.la source
Votre question n'est pas claire mais en fonction du code que vous avez soumis, il semble que vous souhaitiez que la variable
check
stocke l'état de sortie de lagrep
commande. Pour ce faire, exécutezLors de l' exécution d' une commande à partir d' une coque, de son état de sortie est mis à disposition par l'intermédiaire du paramètre d'enveloppe spéciale
$?
.Ceci est documenté par POSIX (la norme pour les systèmes d'exploitation de type Unix) dans sa spécification pour le shell et l'implémentation de Bash est documentée sous Paramètres spéciaux .
Puisque vous êtes un nouvel apprenant, je vous recommande fortement de commencer par un bon livre et / ou un didacticiel en ligne pour obtenir les bases. Les recommandations de ressources externes sont déconseillées sur les sites Stack Exchange mais je suggère le guide Bash de Lhunath et GreyCat .
la source
Vous avez dit à bash de définir la variable
check=grep
dans l'environnement qu'elle transmet à la commandemais
ci
n'existe pas.Je pense que vous vouliez inclure cette commande entre des tiques inverses ou entre parenthèses précédées d'un signe dollar, l'une ou l'autre affectant le nombre de lignes sur lesquelles le `` texte '' a été trouvé (en respectant la casse) dans le fichier:
Devrait maintenant
$check
être 0 s'il n'y a pas de correspondance, ou positif s'il y avait des correspondances.la source
Vous ne savez pas pourquoi utiliser -c lors de la vérification de la sortie? Il est utilisé pour vérifier combien de fois quelque chose est apparié - pas si c'est réussi ou non.
mais dans cet exemple
Il ne produit rien sauf un code de sortie, qui est ensuite répété. Il s'agit de la sortie utilisée par la vérification des variables. Je le préfère aussi car c'est une seule ligne.
Vous pouvez remplacer --silent par -q. Je l'utilise car vous n'êtes pas intéressé par la sortie grep, que cela fonctionne ou non.
la source
La manière correcte d'affecter la sortie de la commande grep à une variable est comme mentionné @ monty-hard:
Bien que pour affecter le statut de sortie de cette commande à une variable, vous devez utiliser le paramètre shell
$?
juste après l'exécution de la commande, comme indiqué ci-dessous:la source