web-dev-qa-db-fra.com

Vérifier si la chaîne d'entrée existe dans le fichier

Vous devez read string1, que dois-je faire? Voici mon code:

#!/bin/sh
echo "Enter your sting: "
read read string1
if [ grep -q $string1 file.txt ];then
   echo "Found it"
else
   echo "Sorry this string not in file"
fi
exit 0
1
BigAlligator
  • Votre commande read est incorrecte, elle doit être read string1 (et vous devez utiliser -r pour éviter que read ne répercute pas les barres obliques inverses: read -r string1);
  • Le test est également incorrect, il devrait s'agir de if grep -q $string1 file.txt puisque vous n'évaluez pas la sortie de grep mais plutôt sa valeur de retour;
  • Vous devez passer l'option -F à grep pour l'empêcher d'interpréter les métacaractères d'expression régulière comme tels: if grep -qF $string1 file.txt
  • Vous devez doubler $string1 pour éviter une expansion potentielle du nom de fichier et/ou une division de Word: if grep -qF "$string" file.txt

Autres notes:

  • Le exit 0 à la fin est redondant et n'est pas vraiment nécessaire, car si le script parvient à atteindre ce point sans erreur, il retourne 0 de toute façon;
  • ShellCheck est une ressource très utile pour déboguer des scripts.

Donc, le script corrigé selon ce qui précède serait:

#!/bin/sh
echo "Enter your sting: "
read string1
if grep -qF "$string1" file.txt;then
   echo "Found it"
else
   echo "Sorry this string not in file"
fi
1
kos

Je pense qu'il est toujours préférable de stocker le résultat, le nombre de correspondances dans ce cas, dans une variable.

Cela dit, vous avez 2 choix, utilisez grep -c pour compter les lignes correspondantes.

count=$(grep -c "$string1" file.txt)

Ou dirigez les lignes correspondantes vers wc à partir de grep -o (--only-match)

count=$(grep -o "$string1" file.txt | wc -l)

Ce sera le script complet avec la deuxième option

#!/bin/sh
echo "Enter your string: "
read string1
count=$(grep -o "$string1" file.txt | wc -l)
if [ $count != 0 ];then
   echo "Found it ($count times)"
else
   echo "Sorry this string not in file"
fi
exit 0

En outre, vous avez écrit read deux fois.

0
bistoco