OVH Cloud OVH Cloud

[zsh] chercher une erreur

11 réponses
Avatar
Rakotomandimby
Bonjour j'ai le script zsh suivant , dont j'ai fait des exemples simples
avant de faire ce script compliqué , et voila que quand je tente de
l'executer , j'ai l'erreur

./playlist2.sh:68: parse error near `\n'

Ce qui correspond plus ou moins au cas * ) du "case ... esac ."

Le souci c'est que je ne vois pas ce qui cloche et en inserant des saut de
lignes pour voir si il detecte l'erreur quelques lignes plus bas ( si je
descend ce " *) " de 3 lignes , l'erreur devrait etre detectée en ligne
71 ) il detecte toujours l'erreur a la ligne 68 .

Comment faire ?
Merci d'avance .

=========================================================================
#!/bin/zsh
# files containing numbers
LAST_LINE_HIRAMASINA_FILE=/tmp/last_line_hiramasina
LAST_LINE_PROFANE_FILE=/tmp/last_line_profane
PLAYED_HIRAMASINA_FILE=/tmp/played_hiramasina

# files that are randomized playlist
LIST_PROFANE=/home/audio/music/playlist_ogg.pls
LIST_HIRAMASINA=/home/audio/music/jaim/playlist_jaim.m3u

# the predication file
PREDICATION=/home/audio/music/predication.ogg

#max lines for further programming ( not yet implemented )
LIST_PROFANE_LINES=`wc -l /home/audio/music/playlist_ogg.pls | awk '{print
$1}'`
LIST_HIRAMASINA_LINES=`wc -l /home/audio/music/jaim/playlist_jaim.m3u | awk
'{print $1}'`

LL_PROFANE=`awk '{print $1}' $LAST_LINE_PROFANE_FILE`
LL_HM=`awk '{print $1}' $LAST_LINE_HIRAMASINA_FILE`
PLAYED_HIRAMASINA=`awk '{print $1}' $PLAYED_HIRAMASINA_FILE`
LERA_MASINA=`awk '{print $1}' /tmp/lera_masina`


if (( LERA_MASINA == 1 )) then

#To play 3 hiramasina

#Read what is the rank to play
#into a file , an increment it
#after playing it
PLAYED_HIRAMASINA=`awk '{print $1}' $PLAYED_HIRAMASINA_FILE`
case $(( PLAYED_HIRAMASINA % 6 )) in

1 | 2 ) 
{ sed -n ${LL_HM}p $LIST_HIRAMASINA ;
((LL_HM += 1)) ;
print $LL_HM > $LAST_LINE_HIRAMASINA_FILE ;
((PLAYED_HIRAMASINA +=1)) ;
print $PLAYED_HIRAMASINA > $PLAYED_HIRAMASINA_FILE;
};;

3 )
{
print $PREDICADTION ;
((PLAYED_HIRAMASINA +=1)) ;
print $PLAYED_HIRAMASINA > $PLAYED_HIRAMASINA_FILE ;
} ;;

4 ) 
{ sed -n ${LL_HM}p $LIST_HIRAMASINA ;
((LL_HM += 1)) ;
print $LL_HM > $LAST_LINE_HIRAMASINA_FILE ;
((PLAYED_HIRAMASINA +=1)) ;
print $PLAYED_HIRAMASINA > $PLAYED_HIRAMASINA_FILE;
};;

5 )
{
sed -n ${LL_HM}p $LIST_HIRAMASINA ;
((LL_HM += 1)) ;
print $LL_HM > $LAST_LINE_HIRAMASINA_FILE ;
((PLAYED_HIRAMASINA +=1)) ;
print $PLAYED_HIRAMASINA > $PLAYED_HIRAMASINA_FILE;
print 0 > /tmp/lera_masina ;
};;
 
* ) 
{
sed -n ${LL_HM}p $LIST_HIRAMASINA ;
print 0 > /tmp/lera-masina ;
} ;;

esac
else
sed -n ${LL_PROFANE}p $LIST_PROFANE
((LL_PROFANE += 1))
echo $LL > $LAST_LINE_PROFANE_FILE
fi

10 réponses

1 2
Avatar
Stephane Chazelas
2004-01-17, 23:29(+01), Rakotomandimby:
[...]
if (( LERA_MASINA == 1 )) then
[...]


if (( LERA_MASINA == 1 )); then

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Rakotomandimby
Stephane Chazelas wrote:

if (( LERA_MASINA == 1 )); then


merci beaucoup .
--
http://mrakotom.free.fr

Avatar
Rakotomandimby
Stephane Chazelas wrote:
if (( LERA_MASINA == 1 )) then
if (( LERA_MASINA == 1 )); then

OK , j'ai donc revu en detail la syntaxe des details , et j'ai vu que pour

chaque cas de "case" , il faut les mettre entre parenthese et non avec une
parenthese fermante . Mais du coup j'ai un erreur systematique a la ligne
30 ( celle de l'accolade ouvrante du premier cas , ( 1|2|4 ) { ... } ) . si
j'insere des sauts de lignes , ça fait varier le N° de la ligne de
l'erreur. J'ai verifié ( et re-verifié ) la syntaxe , et la je seche , j'ai
mal a la tete ... si vous pourviez m'aider l'erreur est :

./playlist.sh:30: parse error near `n'

Le script :

#!/bin/zsh

# files containing numbers
LAST_LINE_HIRAMASINA_FILE=/tmp/last_line_hiramasina
LAST_LINE_PROFANE_FILE=/tmp/last_line_profane
PLAYED_HIRAMASINA_FILE=/tmp/played_hiramasina

# files that are randomized playlist
LIST_PROFANE=/home/audio/music/playlist_ogg.pls
LIST_HIRAMASINA=/home/audio/music/jaim/playlist_jaim.m3u

# the predication file
PREDICATION=/home/audio/music/predication.ogg

#max lines for further programming ( not yet implemented )
LIST_PROFANE_LINES=
`wc -l /home/audio/music/playlist_ogg.pls | awk '{print $1}'`
LIST_HIRAMASINA_LINES=
`wc -l /home/audio/music/jaim/playlist_jaim.m3u | awk '{print $1}'`

LL_PROFANE=`awk '{print $1}' $LAST_LINE_PROFANE_FILE`
LL_HM=`awk '{print $1}' $LAST_LINE_HIRAMASINA_FILE`
PLAYED_HIRAMASINA=`awk '{print $1}' $PLAYED_HIRAMASINA_FILE`
LERA_MASINA=`awk '{print $1}' /tmp/lera_masina`


if (( LERA_MASINA==1 ));then

PLAYED_HIRAMASINA=`awk '{print $1}' $PLAYED_HIRAMASINA_FILE`;
case $(( PLAYED_HIRAMASINA % 6 )) in
(1|2|4) 
# l'erreur est declarée ICI . alors que je vois rien de bizarre
#ni avant ni apres
{
sed -n ${LL_HM}p $LIST_HIRAMASINA ;
((LL_HM += 1)) ;
print $LL_HM > $LAST_LINE_HIRAMASINA_FILE ;
((PLAYED_HIRAMASINA +=1)) ;
print $PLAYED_HIRAMASINA > $PLAYED_HIRAMASINA_FILE;
} ;;

(3)
{
print $PREDICADTION ;
((PLAYED_HIRAMASINA +=1)) ;
print $PLAYED_HIRAMASINA > $PLAYED_HIRAMASINA_FILE ;
} ;;

(5)
{
sed -n ${LL_HM}p $LIST_HIRAMASINA ;
((LL_HM += 1)) ;
print $LL_HM > $LAST_LINE_HIRAMASINA_FILE ;
((PLAYED_HIRAMASINA +=1)) ;
print $PLAYED_HIRAMASINA > $PLAYED_HIRAMASINA_FILE;
print 0 > /tmp/lera_masina ;
};;
 
(*) 
{
sed -n ${LL_HM}p $LIST_HIRAMASINA ;
print 0 > /tmp/lera_masina ;
} ;;
esac

else

sed -n ${LL_PROFANE}p $LIST_PROFANE;
((LL_PROFANE += 1));
echo $LL > $LAST_LINE_PROFANE_FILE;

fi


--
http://mrakotom.free.fr


Avatar
Stephane Chazelas
2004-01-18, 16:05(+01), Rakotomandimby:
[...]
LIST_PROFANE_LINES=
`wc -l /home/audio/music/playlist_ogg.pls | awk '{print $1}'`
[...]


Ce qui est la même chose que:

LIST_PROFANE_LINES= `wc -l /home/audio/music/playlist_ogg.pls | awk '{print $1}'`
C'est à dire que ça devrait lancer la commande "123" avec
LIST_PROFANE_LINES= dans son environnement.

LIST_PROFANE_LINES=$(
wc -l /home/audio/music/playlist_ogg.pls | awk '{print $1}'
)

si tu veux le mettre sur plusieurs lignes.

ou (avec zsh):

LIST_PROFANE_LINES=${"$(
wc -l < /home/audio/music/playlist_ogg.pls)"// /}

Ou, si tu veux mettre toutes les lignes non-vides dans un
tableau:

liste=( ${(f)"$(cat playlist_ogg.pls)"} )
ou
IFS=$'n'
liste=( $(cat playlist_ogg.pls) )

Le nombre d'éléments est dans $#liste.

[...]
PLAYED_HIRAMASINA=`awk '{print $1}' $PLAYED_HIRAMASINA_FILE`;


Les ";" ne sont pas nécessaires.
Tu peux aussi faire


IFS=$' t' read -r PLAYED_HIRAMASINA_FILE zap_rest < $PLAYED_HIRAMASINA_FILE

case $(( PLAYED_HIRAMASINA % 6 )) in
(1|2|4) 
# l'erreur est declarée ICI . alors que je vois rien de bizarre
#ni avant ni apres


(1|2|4)| <ou quoi?>

Si c'est "ou chaine vide", c'est
(1|2|4|"")
ou
1|2|4|"")
Ce qui est après ")" fait partie de la commande à lancer.

[...]
 
(*) 


C'est quoi ces "|" partout ?

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Stephane Chazelas
2004-01-18, 18:46(+01), Stephane Chazelas:
[...]
[...]
 
(*) 


C'est quoi ces "|" partout ?


Ah, c'étaient pas des "|", c'étaient des non-breaking space
(0xa0)

Donc, il vient de là ton problème, tu as des caractères
invisibles dans ton script (vim l'affiche sous forme de "| ",
c'est pour ça que je les ai pris pour des "|").

Fais un :%s/<Ctrl-V>xa0/ /g
dans vim pour les remplacer par des espaces.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Rakotomandimby
Stephane Chazelas wrote:
[...]
(*)


C'est quoi ces "|" partout ?


Ah, c'étaient pas des "|", c'étaient des non-breaking space
(0xa0)

Donc, il vient de là ton problème, tu as des caractères
invisibles dans ton script (vim l'affiche sous forme de "| ",
c'est pour ça que je les ai pris pour des "|").

Fais un :%s/<Ctrl-V>xa0/ /g
dans vim pour les remplacer par des espaces.


ah ben voila , si les caracteres invisibles s'y mettent ... bon j'ai demandé
sur f.c.a.emacs comment faire pour ne pas avoir ce genre de souci , puisuqe
ce n'est pas le seul script auquel j'aurai ( a faire | affaire ) .

Je te remercie infiniment pour ton aide .

Dis moi , ... tu n'es pas enseignant ? a tout hasard , parceque tu as tres
'didactique' dans tes reponses ... :-) . C'est tres appreciable .

--
http://mrakotom.free.fr



Avatar
Rakotomandimby
Stephane Chazelas wrote:
Donc, il vient de là ton problème, tu as des caractères
invisibles dans ton script (vim l'affiche sous forme de "| ",
c'est pour ça que je les ai pris pour des "|").


Mais ce que je ne comprend pas , en y reflechissant, c'est pourquoi la ou je
l'ai mis (involontairement) un espace (non secable soit-il) est genant .

ou alors l'espace insecable a une signification particuliere ? plus que
l'espace tout court ?
--
http://mrakotom.free.fr

Avatar
Rakotomandimby
Stephane Chazelas wrote:
Donc, il vient de là ton problème, tu as des caractères
invisibles dans ton script (vim l'affiche sous forme de "| ",
c'est pour ça que je les ai pris pour des "|").


Mais ce que je ne comprend pas , en y reflechissant, c'est pourquoi la ou je
l'ai mis (involontairement) un espace (non secable soit-il) est genant .

ou alors l'espace insecable a une signification particuliere ? plus que
l'espace tout court ?
--
http://mrakotom.free.fr

Avatar
Rakotomandimby
Stephane Chazelas wrote:
Donc, il vient de là ton problème, tu as des caractères
invisibles dans ton script (vim l'affiche sous forme de "| ",
c'est pour ça que je les ai pris pour des "|").


Mais ce que je ne comprend pas , en y reflechissant, c'est pourquoi la ou je
l'ai mis (involontairement) un espace (non secable soit-il) est genant .

ou alors l'espace insecable a une signification particuliere ? plus que
l'espace tout court ?
--
http://mrakotom.free.fr

Avatar
Rakotomandimby
Stephane Chazelas wrote:
Donc, il vient de là ton problème, tu as des caractères
invisibles dans ton script (vim l'affiche sous forme de "| ",
c'est pour ça que je les ai pris pour des "|").


Mais ce que je ne comprend pas , en y reflechissant, c'est pourquoi la ou je
l'ai mis (involontairement) un espace (non secable soit-il) est genant .

ou alors l'espace insecable a une signification particuliere ? plus que
l'espace tout court ?
--
http://mrakotom.free.fr

1 2