Forum Programmation.shell problème espace dans les noms de fichier

Posté par  (site web personnel) .
Étiquettes : aucune
0
24
fév.
2006
bonjour
j'essaye de faire un pgm sh et je ne trouve pas la solution à ce problème. Le script 1 fonctionne mais pas les autres? Evidement je veux utiliser les autres. Merci de m'éclairer.
jean claude

script 1
#!/bin/sh
taille=`mkisofs -R -q -print-size "/home/jeanclaude/Photo/noel 2005/dscn0323.jpg"`
echo $taille


script 2
#!/bin/sh
essai='"/home/jeanclaude/Photo/noel 2005/dscn0323.jpg"'
taille=`mkisofs -R -q -print-size $essai`
echo $taille



script 3
#!/bin/sh
essai="\"/home/jeanclaude/Photo/noel 2005/dscn0323.jpg\""
taille=`mkisofs -R -q -print-size $essai`
echo $taille


script 4
#!/bin/sh
essai="/home/jeanclaude/Photo/noel\ 2005/dscn0323.jpg\"
taille=`mkisofs -R -q -print-size $essai`
echo $taille
  • # ...

    Posté par  . Évalué à 2.

    script2: les doubles guillemets sont prises en comptes dans le nom de ton fichier puisque tu encadre le tout avec des simples guillemets
    script3: voir script 2 s/simples/doubles
    script4: le backslash avant ta derniere guillemet inclue cette derniere dans le nom de ton fichier, du coup il te manque une guillemet fermante et ton nom de fichier est incorrect
    • [^] # Re: ...

      Posté par  . Évalué à 2.

      oops j'ai oublie la solution, mais je pense que tu l'auras devinee tout seul:

      #!/bin/sh
      essai="/home/jeanclaude/Photo/noel 2005/dscn0323.jpg"
      taille=`mkisofs -R -q -print-size $essai`
      echo $taille
      • [^] # Re: ...

        Posté par  (site web personnel) . Évalué à 1.

        #!/bin/sh
        essai="/home/jeanclaude/Photo/noel 2005/dscn0323.jpg"
        taille=`mkisofs -R -q -print-size $essai`
        echo $taille

        j'avais biensur essayé mais ca ne marche pas
    • [^] # Re: ...

      Posté par  (site web personnel) . Évalué à 1.

      merci de répondre mais je ne comprends toujours pas.

      script2 il me faut bien prendre en compte les doubles guillemets puisqu'il y a un espace (d'ailleur je les met dans le script1 et ca marche?)
      script4 je me suis trompé en recopiant c'est
      essai="/home/jeanclaude/Photo/noel\ 2005/dscn0323.jpg"
      mon ordinateur est en utf8, pensez vous que cela puisse venir de la?
      • [^] # Re: ...

        Posté par  . Évalué à 2.

        1er point:
        lorsque tu utilises une variable dans une commande interpretee par le shell, celui ci effectue une substitution, c'est a dire qu'il remplace la variable par son contenu. Le contenu est tout ce qui se trouve entre les guillemets

        2eme point:
        lorsque tu ecris une ligne dans ta console (ou dans un script interprete par un shell), le shell va decouper ta ligne en morceau en considerant que chaque morceau est separe par un espace. Si plusieurs morceaux sont incluent dans des simples ou doubles guillemets, le shell considere que tous ces morceaux n'en forme qu'un seul
        exemples:
        - ls /home/jeanclaude/Photo/noel 2005/dscn0323.jpg
        le shell va chercher les fichiers /home/jeanclaude/Photo/noel, puis 2005/dscn0323.jpg
        - ls "/home/jeanclaude/Photo/noel 2005/dscn0323.jpg"
        le shell va chercher le fichier /home/jeanclaude/Photo/noel 2005/dscn0323.jpg
        lors de la substituion d'une variable par son contenu, tout le contenu est considere comme un seul morceau.

        3eme point:
        l'utilisation d'un backslash (\) dans ta ligne de commande indique au shell que le caractere qui suit ne doit pas etre interprete: l'espace qui suit un backslash n'est plus considere comme un separateur de morceaux mais comme un espace faisant parti du morceau en cours. De meme pour la guillemet se trouvant apres un backslash: elle ne delimite plus un morceau mais fait parti du morceau en cours.

        script2: du 1er et 3eme point decoule que $essai sera remplace par "/home/jeanclaude/Photo/noel 2005/dscn0323.jpg", les guillements et l'espace etant considere comme faisant parti du morceau. C'est comme si tu avais ecrit
        taille=`mkisofs -R -q -print-size \"/home/jeanclaude/Photo/noel\ 2005/dscn0323.jpg\"`
        tu dournis a mkisofs le fichier \"/home/jeanclaude/Photo/noel\ 2005/dscn0323.jpg\"

        script3: tes backslashs sont inclus dans le morceau ; c'est equivalent a :
        taille=`mkisofs -R -q -print-size \\\"/home/jeanclaude/Photo/noel\ 2005/dscn0323.jpg\\\"`
        tu fournis a mkisofs le fichier \\\"/home/jeanclaude/Photo/noel\ 2005/dscn0323.jpg\\\"

        script4: pareil que script 3, ton backslash est inclus dans le morceau, et ta commande est equivalente a:
        taille=`mkisofs -R -q -print-size /home/jeanclaude/Photo/noel\\ 2005/dscn0323.jpg`
        tu fournis a mkisofs d'une part le fichier /home/jeanclaude/Photo/noel\\, puis le fichier 2005/dscn0323.jpg

        j'espere que c'est plus clair.... en me relisant, c'est pas sur :)
        • [^] # Re: ...

          Posté par  . Évalué à 1.

          J'en profite pour poser une autre question
          si je fais un truc du genre:

          for i in `find . -type f`; do echo $i ; done
          Tous les fichiers qui ont un espace donnent 2 lignes à la sortie, comment je fais dans ce cas là?
          find . -type f retourne une liste et le for semble prendre l'espace OU le retour chariot comme séparateur d'élements de la liste, alors que moi je voudrai qu'il prenne uniquement le retour chariot.
      • [^] # Re: ...

        Posté par  . Évalué à 3.

        C'est très simple, TOUTES les variables qui peuvent avoir des espaces doivent être encadré par des guillements.

        essai="/home/jeanclaude/Photo/noel 2005/dscn0323.jpg"

        taille=`mkisofs -R -q -print-size "$essai"`

        echo $taille

        A noter que pour une question de clarté, les `cmd "$essai"` peuvent être remplacé par $(cmd"$essai") ca fait pareil.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.