Executer un fichier sh

Résolu/Fermé
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 29 mai 2007 à 23:31
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 1 juin 2007 à 10:44
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

13 réponses

ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
29 mai 2007 à 23:34
>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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
29 mai 2007 à 23:38
Salut,

Ton script est exécutable ?

Change ta dernière ligne par :
done <$fichier
;-))
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
30 mai 2007 à 00:14
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
30 mai 2007 à 06:26
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
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
31 mai 2007 à 13:17
Ok, désolé :)
Il faut que je m'y remette un peu !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
30 mai 2007 à 10:08
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
30 mai 2007 à 10:38
En déclarant le fichier explicitement, ta ligne doit ressembler à :
done < fich01.txt
;-)
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 08:29
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
31 mai 2007 à 08:59
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
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 09:05
Merci jipicy!!!

Bonne journée.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
31 mai 2007 à 09:57
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
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 13:58
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
31 mai 2007 à 14:54
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
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 19:29
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
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 20:50
voici les erreur que j'ai:

Le lien a été créé:
https://www.cjoint.com/?fFuWUFjhOw
BAT
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
1 juin 2007 à 08:12
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
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
1 juin 2007 à 10:44
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