Script bash : boucle for et espace
Fermé
Vence
-
5 juil. 2009 à 11:47
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 6 févr. 2011 à 08:38
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 6 févr. 2011 à 08:38
A voir également:
- For bash
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Copytrans heic for windows - Télécharger - Visionnage & Diaporama
- Download instagram for pc - Télécharger - Divers Communication
- Saveaspdf.exe for office 2007 - Télécharger - Bureautique
- Idm for mac - Télécharger - Téléchargement & Transfert
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
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
5 juil. 2009 à 12:12
5 juil. 2009 à 12:12
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]$;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
5 juil. 2009 à 12:15
5 juil. 2009 à 12:15
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 ;-)))
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 ;-)))
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
5 juil. 2009 à 12:18
5 juil. 2009 à 12:18
Là est toute la complexité des langages informatique ;-((
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
Modifié par lami20j le 6/02/2011 à 08:39
Modifié par lami20j le 6/02/2011 à 08:39
Salut,
si son nom contenait à la base déjà ce caractère.
Oui, effectivement ;-)
si son nom contenait à la base déjà ce caractère.
Oui, effectivement ;-)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
5 juil. 2009 à 12:10
5 juil. 2009 à 12:10
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
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
5 juil. 2009 à 12:13
5 juil. 2009 à 12:13
Salut,
Oops; trop tard ;-((
Oops; trop tard ;-((
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
5 juil. 2009 à 12:16
5 juil. 2009 à 12:16
Re,
Pas du tout.
Ta solution est meilleure ;-)
En revanche les deux solutions, lui permettre de comprendre ce qui se passe en fait ;-)
Pas du tout.
Ta solution est meilleure ;-)
En revanche les deux solutions, lui permettre de comprendre ce qui se passe en fait ;-)
Vence
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
5 juil. 2009 à 13:06
5 juil. 2009 à 13:06
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
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
Vence
5 juil. 2009 à 13:19
5 juil. 2009 à 13:19
Si tu ne les lances pas explicitement (./script.sh ou sh script.sh) et ne fais que les afficher, pas de soucis ;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
Vence
5 juil. 2009 à 13:21
5 juil. 2009 à 13:21
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.
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.
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) ?
3 août 2009 à 14:42
Ta solution fonctionne également.
Merci.