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 *.zip
pas `ls ...`
. La suggestion de @ cuonglm est de faire en sorte que *.zip
rien ne se développe lorsque le modèle ne correspond à aucun fichier. ls
sans arguments répertorie le répertoire courant.
ls
est 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 nullglob
avant d'exécuter la boucle for.