Simple Bash - for f in *
Considérer cette simple boucle:
for f in *.{text,txt}; do echo $f; done
Je veux echo SEULEMENT des noms de fichier valide. Utilisez la fonction $f variable dans un script tout fonctionne très bien, sauf si il ne sont pas tous les fichiers d'extension. Dans le cas d'un ensemble vide, $f est définie sur *.le texte et la ligne ci-dessus echos:
*.text
*.txt
plutôt que d'en écho à rien. Cela crée une erreur si vous essayez d'utiliser $f pour tout ce qui est en attente d'une vrai nom de fichier et la place devient *.
S'il y a des fichiers qui correspondent au générique de sorte qu'il n'est pas un ensemble vide, tout fonctionne comme je le voudrais. par exemple,
123.text
456.txt
789.txt
Comment puis-je le faire sans erreurs et sans apparence de la complexité excessive de la première correspondance de chaîne $f pour un astérisque?
Vous devez vous connecter pour publier un commentaire.
Définir la
nullglob
option.Vous pouvez tester si le fichier existe réellement:
ou vous pouvez utiliser le
find
commande:Aussi, si vous pouvez vous permettre l'utilisation externe de
ls
, vous pouvez échapper à ses résultats en utilisant$IFS
correctement. Contrairement à la nullglob option, ce qui peut arriver assez en toute sécurité à l'intérieur d'un script shell, sans faire appel à shopt.shopt
est un builtin, de sorte que vous ne l'appelez pas "out".IFS
ne sera pas corrigé: des citations, des tuyaux, des arobases... tout ce qui a une signification particulière pour le shell.ls
est utile pour une personne, mais il ya de meilleures façons de parcourir les fichiers.