Executer un fichier sh
Résolu
tht123
Messages postés
72
Statut
Membre
-
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
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
A voir également:
- Executer un fichier .sh
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
13 réponses
>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 < <.
>line 71: `done'< <<(cat $fichier)'
La réponse se trouve donc ligne 71.
Je crois que c'est << et non < <.
Hello,
même après modif:
>line 71: syntax error near unexpected token `done'
>line 71: `done'<cat $fichier'
hmhm
Merci et bonne nuit!
même après modif:
>line 71: syntax error near unexpected token `done'
>line 71: `done'<cat $fichier'
hmhm
Merci et bonne nuit!
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 ...)"
#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 ...)"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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)'
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)'
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
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
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 :
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;-))
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 :
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]$;-))
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
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
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" :
;-))
Pour t'en convaincre affiche ton fichier en te servant du paramètre "-v" de la commande "cat" :
cat -v tht123.shTu 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^MDonc dans un 1er temps il faut que tu convertisses ton fichier exécutable comme suit :sed -i.bak 's/\r$//' tht123.shSi la notation "\r" ne marche pas, essaie :
sed 's/^M//' tht123.shLe 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
;-))
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
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
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... :
PS. Pour les liens "cjoint", ne me mets pas des fichiers ".doc", mets tes captures d'écran directe (images). Merci.
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.
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.
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.