#1 Le 10/11/2019, à 12:20
- Plug
[Résolu] [Bash] espace dans un nom de fichier affecté à une variable
Bonjour,
J'ai une partie de script toute simple (du moins je le croyais ) qui liste les fichiers d'un répertoire
#!/bin/bash
# lister les fichiers
Dir=/home/papa/
Fichiers_papa=$(ls $Dir)
for i in $Fichiers_papa
do
echo $i
done
exit 0
Mais voilà; quand le répertoire contient un fichier dont le nom contient un espace, ça ne marche pas.
papa@pc-linuxshop:~/prg$ Dir=/home/papa/
papa@pc-linuxshop:~/prg$ ls $Dir
fichier_sans_espace 'fichier avec'
papa@pc-linuxshop:~/prg$ Fichiers_papa=$(ls $Dir)
papa@pc-linuxshop:~/prg$ echo $Fichiers_papa
fichier_sans_espace fichier avec
Quand on tape la commande directement en console, le nom du fichier est bien affiché entre quotes.
Mais quand on met le résultat de la commande ls dans une variable, les quotes disparaissent.
Comment peut-on les conserver, ou récupérer le nom du fichier en un seul morceau ?
Désolé pour si peu, je me doute que ce doit être assez simple, mais je ne sais même pas comment formuler ma recherche dans google
Merci
Dernière modification par Plug (Le 10/11/2019, à 16:13)
Hors ligne
#2 Le 10/11/2019, à 12:27
- Watael
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
et voilà ce qui arrive quand on essaie de parcourir la sortie de ls !
for f in "$Dir"/*; do : ce que tu veux avec "$f"; done
c'est tout.
ls sert pour lister, pas pour scripter !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 10/11/2019, à 13:21
- Plug
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
Merci Watael, je vais tester ça.
Donc si je comprends bien "ls, c'est mal" aussi ?
Pourtant ça me semblait être juste une commande dont on traite la sortie.
Alors pourquoi cette sortie là, plus que les autres, ne devrait-elle pas être parcourue ? (juste par curiosité)
Hors ligne
#4 Le 10/11/2019, à 13:27
- Sciensous
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
attention quand même: n'affiche pas les fichiers cachés (précédés d'un .)
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#5 Le 10/11/2019, à 13:41
- Watael
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
parce qu'on est plus susceptible de parcourir cette sortie avec une boucle for.
d'une manière générale, on ne parcourt pas la sortie d'une commande quelconque avec une boucle for parce que celle-ci découpe les lignes en mots, comme tu viens d'en faire l'expérience.
et puis pourquoi utiliser une commande externe quand le shell peut le faire ?
quant aux fichiers cachés, si nécessaires, on peut arranger ça avec shopt.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 10/11/2019, à 15:15
- Plug
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
attention quand même: n'affiche pas les fichiers cachés (précédés d'un .)
Ça tombe je ne les veux pas
d'une manière générale, on ne parcourt pas la sortie d'une commande quelconque avec une boucle for parce que celle-ci découpe les lignes en mots
D'accord, je retiens le principe. Néanmoins, la sortie de ls prend soin de mettre des quotes autour du nom contenant un espace.
Pourquoi l'affectation du résultat à une variable, fait disparaitre ces quotes ?
(Je sais je suis très curieux )
Sinon ta solution règle en effet le problème des noms avec espace mais inclut le chemin dans le résultat alors que je ne voudrais que le nom du fichier. Je vais essayer de retraiter le résultat mais du coup j'ai peur de retomber dans le même problème parce que je vais devoir réaffecter à une variable pour découper (ne garder que le nom sans le path).
Dernière modification par Plug (Le 10/11/2019, à 15:51)
Hors ligne
#7 Le 10/11/2019, à 15:35
- Watael
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
parce que le shell n'interprète pas les "quotes" des autres programmes.
et comme je l'ai dit, for lit des mots, et ne tient pas plus compte des apostrophes/quotes, qui d'ailleurs ne disparaissent pas, mais font partie de la chaîne lue comme n'importe quel autre caractère.
$ var="m\a 'belle phrase' avec des mots"
$ for i in $var; do echo ">$i<"; done
>m\a<
>'belle<
>phrase'<
>avec<
>des<
>mots<
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 10/11/2019, à 15:37
- melixgaro
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
D'accord, je retiens le principe. Néanmoins, la sortie de ls prend soin de mettre des quotes autour du nom contenant un espace.
Pourquoi l'affectation du résultat à une variable, fait disparaitre ces quotes ?(Je sais je suis très curie
Bonjour,
Les apostrophes droites n'apparaissent que lorsque la sortie de ls se fait vers un terminal. Quand tu utilises un pipe ou une redirection vers un fichier, la commande ls le détecte et enlève les apostrophes droites (ou plutôt ne met pas d'apostrophes autour des noms de fichiers avec un espace ou un caractère particulier).
Dernière modification par melixgaro (Le 10/11/2019, à 15:38)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#9 Le 10/11/2019, à 16:10
- Plug
Re : [Résolu] [Bash] espace dans un nom de fichier affecté à une variable
Merci Watel et melixgaro pour ces éclaircissements.
Hors ligne