Pourquoi ma variable ne semble-t-elle pas s'incrémenter dans mon bash en boucle?
Je suis assez nouveau à l'écriture de scripts bash. Je n'arrive pas à obtenir la valeur correcte de mon comptage des variables à afficher à la fin d'un while
boucle dans mon script bash.
Contexte: j'ai une tâche relativement simple: je voudrais faire passer un fichier texte contenant une liste de chemins d'accès aux fichiers d'un script bash, vérifier l'existence de ces fichiers, et de compter le nombre de/fichiers manquants. J'ai obtenu la plupart de que le script fonctionne, sauf pour le comptage de la partie.
N=0
correct=0
incorrect=0
cat $1 | while read filename ; do
N=$((N+1))
echo "$N"
if ! [ -f $filename ]; then
incorrect=$((incorrect+1))
else
correct=$((correct+1))
fi
done
echo "# of Correct Paths: $correct"
echo "# of Incorrect Paths: $incorrect"
echo "Total # of Files: $N"
Si j'ai une liste de 5 fichiers, 4 qui existent, je m'attends à obtenir la sortie suivante (notez le echo
commandement au sein de la while
boucle):
1
2
3
4
5
# of Correct Paths: 4
# of Incorrect Paths: 1
Total # of Files: 5
Au lieu de cela, je reçois:
1
2
3
4
5
# of Correct Paths: 0
# of Incorrect Paths: 0
Total # of Files: 0
Ce qui s'est passé pour les valeurs de ces variables? Google a beaucoup de suggestions de qualité discutable et je pense que je pourrais l'obtenir pour fonctionner avec un peu plus de recherche, mais une brève explication de ce que je fais mal serait très utile.
source d'informationauteur williampli
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous êtes à l'aide de l'inutile
cat
de commande avec un tuyau, provoquant un shell interne est exécuté à être créé. L'essayer sanscat
:Sinon, si vous voulez garder le
cat
pour une raison quelconque, vous pouvez fixer votre script en ajoutant cette ligne avant lacat
instruction:Plus généralement, parfois, vous voulez rediriger la sortie d'une commande. Voici un exemple qui utilise processus de substitution à de la poussière fichiers JavaScript sur le point d'être commis par Git et compte le nombre de fichiers qui ont échoué: