Rechercher : dans
Par :

Script bash : boucle for et espace

Dernière réponse le 3 aoû 2009 à 14:42:54 Vence, le 5 jui 2009 à 11:47:19 
 Signaler ce message aux modérateurs

Bonjour,

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
Configuration: Linux
Firefox 3.0.11

1

Vence, le 5 jui 2009 à 11:52:31

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) ?

Répondre à Vence

2

lami20j, le 5 jui 2009 à 12:10:03
  • +1

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

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


106485010510997108

Répondre à lami20j

4

jipicy, le 5 jui 2009 à 12:13:38
  • +1

Salut,

Oops; trop tard ;-((
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

6

lami20j, le 5 jui 2009 à 12:16:18

Re,

Pas du tout.
Ta solution est meilleure ;-)
En revanche les deux solutions, lui permettre de comprendre ce qui se passe en fait ;-) 106485010510997108

Répondre à lami20j

8

Vence, le 5 jui 2009 à 13:06:59

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

Répondre à Vence

9

jipicy, le 5 jui 2009 à 13:19:28

Si tu ne les lances pas explicitement (./script.sh ou sh script.sh) et ne fais que les afficher, pas de soucis ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

10

lami20j, le 5 jui 2009 à 13:21:49

Salut,

Je ne pense pas que tu risques quelque chose en faisant echo mon script.sh
En ce qui concerne les solutions, tu choisis celle qui te conviens le mieux en fonction de situation. 106485010510997108

Répondre à lami20j

3

jipicy, le 5 jui 2009 à 12:12:39
  • +1

Salut,

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]$
;-)) $ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

5

lami20j, le 5 jui 2009 à 12:15:27

Salut,

Aux guillemets j'ai pensé d'abord mais comme ça ne marchais pas avec ls je n'ai plus pensé tout simplement à for i in *.jpg ;-))) 106485010510997108

Répondre à lami20j

7

jipicy, le 5 jui 2009 à 12:18:25

Là est toute la complexité des langages informatique ;-((
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

11

sluthole, le 11 jui 2009 à 12:30:27

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

Répondre à sluthole

12

 foobar47, le 3 aoû 2009 à 14:42:54

Bonjour,

Ta solution fonctionne également.

Merci.

la modestie cesse quand on commence à en parler 
--
Le piratage nuit gravement à notre liberté individuelle (Loi­ Hadopi) ®jipicy

Répondre à foobar47
Collection CommentÇaMarche.net