Je pensais que ce serait simple - mais cela s'avère plus complexe que ce à quoi je m'attendais.
Je veux parcourir tous les fichiers d'un type particulier dans un répertoire, alors j'écris ceci:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Cela fonctionne tant qu'il y a au moins un fichier correspondant dans le répertoire. Cependant s'il n'y a pas de fichiers correspondants, j'obtiens ceci:
current file is *.zip
J'ai ensuite essayé:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Bien que le corps de la boucle ne s'exécute pas lorsqu'il n'y a pas de fichiers, j'obtiens une erreur de ls:
ls: *.zip: No such file or directory
Comment puis-je écrire une boucle qui ne gère correctement aucun fichier correspondant?
FILES=ls * .zip ; for fname in "${FILES}"...mais cela fonctionne comme prévu avecfor fname in *.zip ; do....
for file in *.zippas `ls ...`. La suggestion de @ cuonglm est de faire en sorte que *.ziprien ne se développe lorsque le modèle ne correspond à aucun fichier. lssans arguments répertorie le répertoire courant.
lsest généralement à éviter: pourquoi ne pas analyser ls? ; voir également le lien en haut de cette page vers l' article ParsingLs de BashGuide .
shopt -s nullglobavant d'exécuter la boucle for.