Executer un fichier sh

Résolu
tht123 Messages postés 72 Statut Membre -  
tht123 Messages postés 72 Statut Membre -
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. ekra Messages postés 1873 Statut Membre 342
     
    >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
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Ton script est exécutable ?

    Change ta dernière ligne par :
    done <$fichier
    ;-))
    0
  3. tht123 Messages postés 72 Statut Membre
     
    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
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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. ekra Messages postés 1873 Statut Membre 342
       
      Ok, désolé :)
      Il faut que je m'y remette un peu !
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tht123 Messages postés 72 Statut Membre
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      En déclarant le fichier explicitement, ta ligne doit ressembler à :
      done < fich01.txt
      ;-)
      0
  7. tht123 Messages postés 72 Statut Membre
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  8. tht123 Messages postés 72 Statut Membre
     
    Merci jipicy!!!

    Bonne journée.
    0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  10. tht123 Messages postés 72 Statut Membre
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  11. tht123 Messages postés 72 Statut Membre
     
    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
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  13. tht123 Messages postés 72 Statut Membre
     
    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