Je veux vérifier si un fichier contient une chaîne spécifique ou non en bash. J'ai utilisé ce script, mais ça ne fonctionne pas :
if [[ 'grep 'SomeString' $File' ]];then
Some Actions
fi
Qu'est-ce qui ne va pas dans mon code ?
Je veux vérifier si un fichier contient une chaîne spécifique ou non en bash. J'ai utilisé ce script, mais ça ne fonctionne pas :
if [[ 'grep 'SomeString' $File' ]];then
Some Actions
fi
Qu'est-ce qui ne va pas dans mon code ?
if grep -q SomeString "$File"; then
Some Actions
fi
Vous n'avez pas besoin [[ ]]
ici. Il suffit d'exécuter la commande directement. Ajouter -q
lorsque vous n'avez pas besoin de la chaîne de caractères affichée lorsqu'elle a été trouvée.
Le site grep
La commande renvoie 0 ou 1 dans le code de sortie selon le résultat de la recherche. le résultat de la recherche. 0 si quelque chose a été trouvé ; 1 sinon.
$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0
Vous pouvez spécifier les commandes comme une condition de if
. Si la commande renvoie 0 dans son code de sortie, cela signifie que la condition est vraie ; sinon, elle est fausse.
$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$
Comme vous pouvez le voir, vous exécutez ici les programmes directement. Aucun autre []
ou [[]]
.
Plus d'informations sur grep
et les options disponibles dans asnwer stackoverflow.com/a/4749368/1702557
Envisager d'utiliser -m 1
afin d'améliorer les performances de l'analyse. Retourne à la première occurrence.
En plus des autres réponses, qui vous ont dit comment faire ce que vous vouliez, j'essaie d'expliquer ce qui n'allait pas (ce qui est ce que vous vouliez).
Dans Bash, if
doit être suivie d'une commande. Si le code de sortie de cette commande est égal à 0, alors la commande then
est exécutée, sinon la partie else
si une partie est exécutée.
Vous pouvez le faire avec n'importe quelle commande comme expliqué dans d'autres réponses : if /bin/true; then ...; fi
[[
est une commande interne de bash dédiée à certains tests, comme l'existence de fichiers, les comparaisons de variables. De même, [
est une commande externe (elle est située typiquement dans /usr/bin/[
) qui effectue à peu près les mêmes tests mais qui a besoin de ]
comme argument final, c'est pourquoi ]
doivent être complétés par un espace à gauche, ce qui n'est pas le cas avec ]]
.
Ici, vous n'avez pas besoin [[
ni [
.
Une autre chose est la façon dont vous citez les choses. En bash, il n'y a qu'un seul cas où les paires de guillemets s'imbriquent, c'est "$(command "argument")"
. Mais en 'grep 'SomeString' $File'
vous n'avez qu'un seul mot, car 'grep '
est une unité citée, qui est concaténée avec SomeString
puis à nouveau concaténée avec ' $File'
. La variable $File
n'est même pas remplacé par sa valeur en raison de l'utilisation de guillemets simples. La façon correcte de procéder est grep 'SomeString' "$File"
.
Version la plus courte (correcte) :
grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"
peut également s'écrire comme suit
grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"
mais vous n'avez pas besoin de le tester explicitement dans ce cas, donc la même chose avec :
grep -q "something" file && echo "yes" || echo "no"
La citation est cassée et vous voulez probablement éviter de voir la sortie de l'application grep
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Similaire à stackoverflow.com/questions/4749330/
0 votes
Voici comment récupérer la sortie d'un fichier de type
command
: stackoverflow.com/questions/12375722/