Boucle for

Bonjour,

J'ai absolument besoin de votre aide ! Je dois faire un programme tout simple en shell pour lundi mais ça ne marche pas.

Par exemple, si je fais une boucle for dans mon programme ça ne lui convient jamais. Avec ce code :

for i in `ls repertoire/`
do
echo $i
done

il me sort : "erreur de syntaxe près du jeton echo inattendu"

Je pense quand même savoir faire des boucles for ! Mince alors !

Vous avez une idée ?
Configuration: Ubuntu
Firefox 3.0.2

22 réponses

Résumé de la discussion

Problème rencontré dans une boucle for en shell lorsque l'exemple utilise for i in `ls repertoire/`, suivi de do sans séparation, ce qui déclenche une erreur de syntaxe près du jeton echo inattendu. Des éléments de réponse indiquent d'utiliser une syntaxe correcte avec des séparateurs: for i in $(ls repertoire/); do echo "$i"; done, ou préférer une expansion de glob pour éviter ls. Certaines réponses suggèrent d'éviter l'usage de ls et d'écrire for f in repertoire/*; do echo "$f"; done pour lister les fichiers sans risque d'espaces ou de noms contenant des espaces. En cas de clarification, l'exécution sur une console peut révéler les chemins et les permissions, et l'usage de quotes autour des variables améliore la robustesse du script.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,

    tape cette commande en utilisant le 1er script de ton 1er message et affiche le résultat
    perl -ne 's/(.)/ord($1)/eg;print'  ton_1er_script
    dit aussi avec quel éditeur tu l'as écrit
    1. Modérateur
      J'ai comme l'impression qu'on parle dans le vide là ;-\

      ;-))
  2. bon ba sans passer à la ligne ça fonctionne !
    Pourtant j'ai eu l'habitude de faire du shell sur les ordis de la fac et j'ai jamais rencontré un problème pareil !

    Merci quand même pour m'avoir aidé !
    1. Modérateur
      Tu peux coller ton script sur Cjoint s'il te plait, merci ;-))
  3. Contributeur
    Je viens de reprendre ton code de début :

    #!/bin/bash
    for i in $(ls File) do
    echo $i
    done

    j'ai juste descendu le do à la ligne en dessous et ça fonctionne :

    #!/bin/bash
    for i in $(ls File)
    do
    echo $i
    done

    Donc pour moi c'est un mystère.
    1. ça me mat toujours la même erreur

      bon sinon grande nouvelle ! Si je met tout le code sur la même ligne avec les séparateurs ; j'ai l'impression que je n'ai plus de problème

      c'est génial la prog sans indenter ! huuummmm ! Je sais pas si je vais faire du shell souvent ! lol
      1. Modérateur
        Re,

        chez moi ça marche
        #!/bin/bash
        
        for i in `ls trash/`
        do
        echo $i
        done


        1. Modérateur
          Ben chez moi aussi :
          [tmpfs]$ cat foo.sh
          #! /bin/bash
          
          for i in ~jp/tmpfs/*
          do
          echo $i
          done
          [tmpfs]$ ./foo.sh
          /home/jp/tmpfs/cleaner.sh
          /home/jp/tmpfs/enonce_test_1_06-10-2007.pdf
          /home/jp/tmpfs/foo.sh
          /home/jp/tmpfs/foo.sh~
          /home/jp/tmpfs/wireless_tools.29
          /home/jp/tmpfs/wireless_tools.29.tar.gz
          [tmpfs]$  
          ;-)
        2. Contributeur
          @jipicyIl a un linux vivant !! il a un linux vivant !!
      2. Contributeur
        Voilà mon code qui fonctionne :

        root@ks362344:~# cat test.sh
        #!/bin/sh

        for i in `ls ./`
        do
        echo $i
        done

        C'est le même exactement.
        1. Modérateur
          Est-ce que ton répertoire File est bien dans le même répertoire d'où tu lances ton script ?
          1. J'ai tapé ce que tu me dis dans mon terminal et tout se passe bien ! J'ai bien la liste des fichiers qui s'affichent !
            En fait, ça ne marche pas quand je le met dans un script shell !

            Mon dossier File ne comporte que des fichiers pdf
            1. Contributeur
              Ah oui au fait remplace #!/bin/bash par #!/bin/sh ca devrait mieux marcher
              1. Modérateur
                Re,

                alors tape dans une console
                for i in $(ls repertoire/);do echo $i;done
                et affiche ce que tu vois à l'écran
                1. non j'ai le même problème mais là il me dit plus qu'il y a une erreur de syntaxe près du jeton echo mais près du jeton do

                  Je suis déséperée !
                  1. Contributeur
                    Faut faire comme ça :

                    for i in $(ls File)
                    do
                    echo $i
                    done

                    Chaque mot clé sur une ligne différente donc sépare ton do comme j'ai fais d'avec la première ligne et ça devrait être bon.
                    1. Oui voilà mon shell :

                      ordijo@ordijo-laptop:~/stage/moulinette$ cat script.sh
                      #!/bin/bash
                      for i in $(ls File) do
                      echo $i
                      doneordijo@ordijo-laptop:~/stage/moulinette$

                      C'est bien ça que tu veux ?
                      J'ai essayé avec l'autre commande ms c pareil !
                      • 1
                      • 2