Dans mon script bash, j'essaie d'imprimer une ligne si une certaine chaîne n'existe pas dans un fichier.
if grep -q "$user2" /etc/passwd; then
echo "User does exist!!"
Voici comment je l'ai écrit si je voulais que la chaîne existe dans le fichier, mais comment puis-je la modifier pour qu'elle s'affiche "l'utilisateur n'existe pas" si l'utilisateur ne se trouve pas dans le fichier/etc/passwd?
grep
renverra le succès s'il trouve au moins une instance du modèle et un échec dans le cas contraire. Vous pouvez donc soit ajouter une clause else
si vous voulez à la fois des impressions "fait" et "ne fait pas", ou vous pouvez simplement annuler la condition if
pour n'obtenir que des échecs. Un exemple de chacun:
if grep -q "$user2" /etc/passwd; then
echo "User does exist!!"
else
echo "User does not exist!!"
fi
if ! grep -q "$user2" /etc/passwd; then
echo "User does not exist!!"
fi
Une alternative consiste à rechercher l'état de sortie de grep
. Par exemple:
grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
echo "User does not exist!!"
Si grep
ne parvient pas à trouver une correspondance, il quittera 1
, donc $?
sera 1
. grep
renverra toujours 0
en cas de succès. Il est donc plus sûr d'utiliser $? != 0
que $? == 1
.
Vous pouvez utiliser option grep "-L/--files-without-match" , pour vérifier si le fichier ne contient pas de chaîne:
if [[ $(grep -L "$user2" /etc/passwd) ]]; then
echo "User does not exist!!";
fi
Je le résous avec un simple liner:
for f in *.txt; do grep "tasks:" $f || echo $f; done
La commande vérifie tous les fichiers du répertoire avec l'extension txt et écrit la chaîne de recherche (c'est-à-dire "tâches:") si elle est trouvée ou bien le nom du fichier.