Script bash : boucle for et espace
Vence
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour,
J'essaie d'utiliser une boucle for avec des noms de fichier comme ceci :
Tout ce passe bien sauf si mes noms de fichiers contiennent des espaces (ce qui est normal puisqu'il utilise les espaces pour séparer les variables)
Auriez vous une solution ?
Vence
J'essaie d'utiliser une boucle for avec des noms de fichier comme ceci :
for i in `ls *.jpg` do echo $i done
Tout ce passe bien sauf si mes noms de fichiers contiennent des espaces (ce qui est normal puisqu'il utilise les espaces pour séparer les variables)
Auriez vous une solution ?
Vence
A voir également:
- For bash
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Bingo bash - Télécharger - Divers Jeux
- Idm for mac - Télécharger - Téléchargement & Transfert
- Copytrans heic for windows - Télécharger - Visionnage & Diaporama
- Instagram for pc - Télécharger - Divers Communication
4 réponses
Bonjour,
Comme disais lamij20 : "C'est normal vu que l'espace est un caractère spécial pour le shell. L'espace sépare les commandes des options, des arguments, etc. "
Pour info, on peut aussi jouer avec ce séparateur de champ (IFS) en le modifiant avec par ex :
IFS=$'\n\t'
for i in `ls *.jpg`
do
echo $i
done
unset IFS
Cdlt, Marc
Comme disais lamij20 : "C'est normal vu que l'espace est un caractère spécial pour le shell. L'espace sépare les commandes des options, des arguments, etc. "
Pour info, on peut aussi jouer avec ce séparateur de champ (IFS) en le modifiant avec par ex :
IFS=$'\n\t'
for i in `ls *.jpg`
do
echo $i
done
unset IFS
Cdlt, Marc
Salut,
Il suffit de double quoter les variables :
Il suffit de double quoter les variables :
[tmpfs]$ ls -1 mon autre fichier.jpg mon autre fichier.txt mon fichier.jpg mon fichier.txt [tmpfs]$ for fich in *.jpg; do echo "$fich"; done mon autre fichier.jpg mon fichier.jpg [tmpfs]$;-))
Salut,
C'est normal vu que l'espace est un caractère spécial pour le shell. L'espace sépare les commandes des options, des arguments, etc.
Voici un exemple
Donc quand tu fais for i in $(ls *.jpg) shell vois ça
Donc il va affiche chaque élément séparé par espace.
Voici une manière de le faire
C'est normal vu que l'espace est un caractère spécial pour le shell. L'espace sépare les commandes des options, des arguments, etc.
Voici un exemple
lami20j@debian:~$ ls *.jpg aa aa.jpg bb bb.jpg capture1.jpg capture2.jpg
Donc quand tu fais for i in $(ls *.jpg) shell vois ça
for i in aa aa.jpg bb bb.jpg capture1.jpg capture2.jpg
Donc il va affiche chaque élément séparé par espace.
Voici une manière de le faire
lami20j@debian:~$ ls *.jpg aa aa.jpg bb bb.jpg capture1.jpg capture2.jpg lami20j@debian:~$ for i in `ls *.jpg|tr " " "_"`; do echo ${i/_/ }; done aa aa.jpg bb bb.jpg capture1.jpg capture2.jpg
Merci pour vos deux solutions. Effectivement je n'avais pas penser à utiliser directement les caractères joker et laisser le bash gérer tout ça sans passer par le ls.
Par contre si d'aventure c'était des *.sh que je listais, ne risquerait-il pas d'exécuter directement les scripts 'listés' ? Auquel cas vaudrait mieux la première solution, non ?
Vence
Par contre si d'aventure c'était des *.sh que je listais, ne risquerait-il pas d'exécuter directement les scripts 'listés' ? Auquel cas vaudrait mieux la première solution, non ?
Vence
J'ai oublié de préciser que du coup si les fichiers contiennent des espaces ça ne "marche" plus (le echo renvoye for justement le bout séparé par des espaces). Or je souhaiterais avoir l'intégralité du nom du fichier. Dois je faire des concaténations jusqu'à avoir un nom de fichier (contenant un . par exemple) ?
Ta solution fonctionne également.
Merci.