Executer un fichier sh

Résolu
Bonsoir,

j'utilise Cygwin pour exécuter le bash suivant:

****************************************************
#! /bin/bash

fichier="$1"

while read line
do
var=$(echo "$line" | sed 's/.\{332\}\(.\{60\}\).*/\1/')
while [ $(grep -o "$var" <<<"$line" | wc -l) -gt "1" ]
do
sed -i '/'"$var"'/ s///2' "$fichier"
line=$(sed -n '/'"$var"'/p' "$fichier")
done
done < <(cat $fichier)
****************(MERCI JIPLICY)*****************
en l'exécutant comme ça:

test.sh fichier.txt

J'ai en retour le message d'erreur suivant :

>line 71: syntax error near unexpected token `done'
>line 71: `done'< <<(cat $fichier)'

J'ai entre autre essayé de remplacer #! /bin/bash par #! /bin/sh
MAIS RIEN??

Déja eu le problème??

D'avance merci
Configuration: Windows XP
Internet Explorer 7.0

13 réponses

  1. >line 71: syntax error near unexpected token `done'
    >line 71: `done'< <<(cat $fichier)'


    La réponse se trouve donc ligne 71.
    Je crois que c'est << et non < <.
    0
    1. Modérateur
      Salut,

      Ton script est exécutable ?

      Change ta dernière ligne par :
      done <$fichier
      ;-))
      0
      1. Hello,

        même après modif:

        >line 71: syntax error near unexpected token `done'
        >line 71: `done'<cat $fichier'

        hmhm

        Merci et bonne nuit!
        0
        1. Modérateur
          Ben essaie de coder le nom du fichier en dur, commente la ligne et remplace-la par:

          #done <$fichier
          done < le_nom_du_fichier.quelque_chose


          et remplace chaque instance de "$fichier" par le nom réel du fichier...

          C'est qu'elle version de bash sous Cygwin ?

          ==> ekra => Non, la syntaxe est la bonne "< <(commande ...)"
          0
          1. Ok, désolé :)
            Il faut que je m'y remette un peu !
            0
        2. Bonjour,

          Si j'essaie avec en premiere ligne : #! /bin/bash ou #! /bin/sh
          ça foire, j'ai en retour :

          tht@WS-CH183 /cygdrive/c/cygwin/bin
          $ tht.sh fich01.txt
          : No such file or directoryin/bash
          /usr/bin/tht.sh: line 12: syntax error near unexpected token 'done'
          /usr/bin/tht.sh: line 12: `done < <(cat fich01.txt)'

          En déclarant le fichier explicitement:

          #! /bin/bash
          #! /bin/sh
          fichier="fich01.txt"
          while read line
          do
          var=$(echo "$line" | sed 's/.\{332\}\(.\{60\}\).*/\1/')
          while [ $(grep -o "$var" <<<"$line" | wc -l) -gt "1" ]
          do
          sed -i '/'"$var"'/ s///2' "fich01.txt"
          line=$(sed -n '/'"$var"'/p' "fich01.txt")
          done
          done < <(cat fich01.txt)

          J AI en retour :

          /usr/bin/tht.sh: line 12: syntax error near unexpected token 'done'
          /usr/bin/tht.sh: line 12: `done < <(cat fich01.txt)'
          0
          1. Modérateur
            En déclarant le fichier explicitement, ta ligne doit ressembler à :
            done < fich01.txt
            ;-)
            0
        3. Hello,

          un grand merci de votre aide mais ça ne va guerre mieu...

          Tiens cette regex :

          's/.\{332\}\(.\{60\}\).*/\1/

          1) .\{332\}\(.\{60\}\).*

          ==> Lecture de la chaine de caractère comprise entre 332 et 392??

          2) \1 : heu??

          BAV
          0
          1. Modérateur
            Salut,

            2) \1 : heu??
            N'affiche que le contenu entre parenthèses, autrement dit dans ton cas, à partir du 333 ème caractères affiche les 60 caractères suivants.

            Si une autre sous-expression entre parenthèse avait été présente, on l'aurait désignée avec le numéro 2.

            Exemple :
            echo "Un,deux,trois" | sed 's/\(.*\),\(.*\),\(.*\)/\3:\1:\2/'
            
            trois:Un:deux
            ;-))
            0
        4. Merci jipicy!!!

          Bonne journée.
          0
          1. Modérateur
            Bon, je reviens à la charge pour régler ton problème n°1...

            Je te colle ci-après un fichier "fich01.txt" de référence avec le programme "tht123.sh".
            Copie/colle ces 2 fichiers dans un répertoire temporaire vide, fais une copie de "fich01.txt", rend le programme (tht123.sh) exécutable et lance-le par "./tht123.sh".

            Normalement tu devrais obtenir le résultat qui suit :
            [jp@MDK tmpfs]$ ls -l
            
            total 12
            -rw-rw-r--  1 jp jp 456 mai 31 09:45 fich01.txt
            -rw-r--r--  1 jp jp 456 mai 31 09:49 old_fich01.txt
            -rwxrwxr-x  1 jp jp 250 mai 31 09:48 tht123.sh*
            
            [jp@MDK tmpfs]$ cat fich01.txt
            
            Champ ref : 001   ABC   de la phrase. Champ ref : 001   ABC   de la phrase. Champ ref : 001   ABC   de la phrase. Champ ref : 001   ABC   de la phrase.
            Champ ref : 002   DEF   de la phrase. Champ ref : 002   DEF   de la phrase. Champ ref : 002   DEF   de la phrase. Champ ref : 002   DEF   de la phrase.
            Champ ref : 003   GHI   de la phrase. Champ ref : 003   GHI   de la phrase. Champ ref : 003   GHI   de la phrase. Champ ref : 003   GHI   de la phrase.
            
            [jp@MDK tmpfs]$ cat tht123.sh
            
            #! /bin/bash
            
            while read line
            do
            var=$(echo "$line" | sed 's/.\{6\}\(.\{18\}\).*/\1/')
            while [ $(grep -o "$var" <<<"$line" | wc -l) -gt "1" ]
            do
            sed -i '/'"$var"'/ s///2' "fich01.txt"
            line=$(sed -n '/'"$var"'/p' "fich01.txt")
            done
            done < fich01.txt
            
            [jp@MDK tmpfs]$ ./tht123.sh
            
            [jp@MDK tmpfs]$ cat fich01.txt
            
            Champ ref : 001   ABC   de la phrase. Champ de la phrase. Champ de la phrase. Champ de la phrase.
            Champ ref : 002   DEF   de la phrase. Champ de la phrase. Champ de la phrase. Champ de la phrase.
            Champ ref : 003   GHI   de la phrase. Champ de la phrase. Champ de la phrase. Champ de la phrase.
            
            [jp@MDK tmpfs]$
            ;-))
            0
            1. Salut,

              Si ça fonctionnait chez moi se serait top mais...

              Jette un oeil si tu souhaites:

              Le lien a été créé: https://www.cjoint.com/?fFn3h2hnZ2

              N'existerait-il pas un patch pour cygwin??

              D'autre part, j'ai même essayé sous dos de lancer la commande :

              tht123.sh fichier01.txt et là surprise le fichier tht123.sh s'ouvre dans notepad??????

              Qu'en dis tu?

              BAT
              0
              1. Modérateur
                Bon je crois avoir trouvé d'où viens le problème, c'est le caractère "retour chariot" propre aux systèmes MS-DOS (Windows par extension).

                Pour t'en convaincre affiche ton fichier en te servant du paramètre "-v" de la commande "cat" :
                cat -v tht123.sh
                Tu devrais obtenir un résultat du genre :
                #! /bin/bash^M
                while read line^M
                do^M
                var=$(echo "$line" | sed 's/.\{6\}\(.\{18\}\).*/\1/')^M
                while [ $(grep -o "$var" <<<"$line" | wc -l) -gt "1" ]^M
                do^M
                sed -i '/'"$var"'/ s///2' "fich01.txt"^M
                line=$(sed -n '/'"$var"'/p' "fich01.txt")^M
                done^M
                done < fich01.txt^M
                Donc dans un 1er temps il faut que tu convertisses ton fichier exécutable comme suit :
                sed -i.bak 's/\r$//' tht123.sh
                Si la notation "\r" ne marche pas, essaie :
                sed 's/^M//' tht123.sh
                Le caractère "^M", s'obtient par la séquence de touches suivante "CTRL-V" + "CTRL-M". Voir à ce sujet : sed conversion retours chariots dos crlf unix lf

                ;-))
                0
            2. Hello,

              ici j'ai un problème bizzare:

              Après avoir lancé la commande : ./tht123.sh

              J'ai une volée de mesage à la queuleuleu:

              sed : cannot rename .sedXXXXXXX : Permission denied

              où XXXXXX varie d'une ligne à l'aitre je suis obligé de quitter avec ctrl+break pour revenir au prompt!!!???

              BAT
              0
              1. Modérateur
                Je n'en sais rien pourquoi ça te fais ça !!!

                Lance le script en mode "débogage", rajoute la ligne "set -xv" en début de script, on en saura peut être un peu plus... :
                #! /bin/bash
                
                set -xv
                
                while read line
                do...
                Au pire, essaie aussi de changer cette ligne :
                while [ $(grep -o "$var" <<<"$line" | wc -l) -gt "1" ]
                par :
                while [ $(echo "$line" | grep -o "$var" | wc -l) -gt "1" ]
                C'est pas dit que ça change quoi que ce soit, mais vu que Cygwin fait des caprices.

                PS. Pour les liens "cjoint", ne me mets pas des fichiers ".doc", mets tes captures d'écran directe (images). Merci.
                0
                1. Bonjour,

                  Maintenant ça fonctionne, mais voilà pourquoi:

                  Initialement j'ai découvert la suite core utils qui reprend une suite d'utilitaires linux :

                  http://gnuwin32.sourceforge.net/packages/coreutils.htm

                  Avec laquelle ça allait pas trop mal en commandant directement depuis le DOS, mais il n'y a pas tous les outils! nottament le shell!!!

                  Alors j'ai tenté la migration sous CYGWIN et en reprenant depuis le début : SOIT POUR LE POST DE HAUT DE PAGE C'EST OK!

                  Voilà comment j'ai procédé pour les intéressé(e)s :

                  1) création du fichier .sh au format unix, soit il faut appliquer la commande : sed -i.bak 's/\r$//' tht123.sh

                  2) Executer : ./tht123.sh

                  ########################################
                  #tht123.sh
                  #! /bin/bash

                  fichier="$1"

                  while read line
                  do
                  var=$(echo "$line" | sed 's/.\{332\}\(.\{60\}\).*/\1/')
                  while [ $(grep -o "$var" <<<"$line" | wc -l) -gt "1" ]
                  do
                  sed -i '/'"$var"'/ s///2' "$fichier"
                  line=$(sed -n '/'"$var"'/p' "$fichier")
                  done
                  done < <(cat $fichier)
                  ########################################

                  Mais le script relatif à mon post 14 donne toujours le même genre d'erreurs, bon ça va puisque le problème initial est résolu.

                  VOILA, alors bien merci à tous.
                  0

                  Discussions similaires

                  question pix mot caché

                  7 réponses