2010-10-27 5 views
2

I`v a écrit un script, et ont fin de fichier inattenduescript bash, ligne 30: Erreur de syntaxe: fin de fichier inattendue

echo off 
if [$JAVA_HOME = ""]; then goto no_java_home fi 
if [$SRV_HOME = ""]; then goto no_srv_home fi 
echo Uses JAVA_HOME=$JAVA_HOME 
echo Uses SRV_HOME=$SRV_HOME 
export ACP="" 
export ACP=$ACP;$JAVA_HOME/lib/tools.jar 
export ACP=$ACP;$SRV_HOME/ant/lib/ant.jar 
export ACP=$ACP;$SRV_HOME/ant/lib/ant-launcher.jar 
export ACP=$ACP;$SRV_HOME/ant/lib/ant-nodeps.jar 
export ACP=$ACP;$SRV_HOME/ant/lib/optional.jar 
export ACP=$ACP;$SRV_HOME/ant/lib/ant-contrib-1.0b3.jar 
$JAVA_HOME/bin/java -Xmx512m -classpath $ACP org.apache.tools.ant.Main -buildfile $SRV_HOME/ant/ant_script.xml %* 
goto ends 

no_srv_home: 
clear 
echo "You should set the TMX_HOME environment variable. For example: TMX_HOME=d:\MYSERVER" 
goto ends 

no_java_home: 
clear 
echo "You should set the JAVA_HOME environment variable" 
goto ends 
ends: echo "OK" 

Où est mon problème?

+0

Bash n'a pas 'goto' ou' echo off' et vous devez mettre un espace après '[' et avant ']'. Vous n'avez peut-être pas besoin d'exporter la variable ACP puisqu'elle est passée en argument (Java la recherche-t-elle dans son environnement?). –

Répondre

4

Votre problème est que votre script ressemble à un mélange aléatoire de bash et la syntaxe cmd. Voici un script bash.

if [ "$JAVA_HOME" = "" ]; then 
    echo 1>&2 "$0: You need to set the JAVA_HOME variable, e.g.: export JAVA_HOME='c:/java'" 
    exit 2 
fi 
if [ "$SRV_HOME" = "" ]; then 
    echo 1>&2 "$0: You need to set the SRV_HOME variable, e.g.: export SRV_HOME='d:/myserver'" 
    exit 2 
fi 
echo "$0: Uses JAVA_HOME=$JAVA_HOME" 
echo "$0: Uses SRV_HOME=$SRV_HOME" 
ACP="$JAVA_HOME/lib/tools.jar" 
for x in ant ant-launcher ant-nodeps optional ant-contrib-1.0b3; do 
    ACP="$ACP;$SRV_HOME/ant/lib/$x.jar" 
done 
"$JAVA_HOME/bin/java" -Xmx512m -classpath "$ACP" \ 
         org.apache.tools.ant.Main \ 
         -buildfile "$SRV_HOME/ant/ant_script.xml" \ 
         "[email protected]" 

Voici une liste des choses que j'ai corrigé:

  • Bash a structuré des constructions de programmation (blocs, conditionals, boucles). Il n'a pas goto.
  • La commande de test [ … ] requiert des espaces de chaque côté des parenthèses (sauf avec des signes de ponctuation tels que ;).
  • Toutes les substitutions de variables ($foo) doivent être entre guillemets doubles (sinon le shell fera des choses étranges si la valeur de la variable contient certains caractères spéciaux tels que des espaces). Les messages d'erreur doivent être affichés sur la sortie d'erreur: echo 1>&2 "this is an error message". (Cela s'appliquerait également à un script cmd.)
  • Si une erreur se produit, le script doit renvoyer un état différent de zéro. (Cela s'appliquerait également à un script cmd.)
  • Étant donné que ACP est une variable de script interne, il n'est pas nécessaire de l'exporter dans l'environnement.
  • ; est un caractère spécial, il doit donc être cité lorsque vous souhaitez l'utiliser dans une chaîne.
  • (Facultatif) Vous pouvez éviter de répéter la même chaîne plusieurs fois avec une boucle (les boucles dans bash n'ont pas les limitations fous qu'elles ont dans cmd).
  • Le %* de Cmd est "[email protected]" de bash.
  • (Facultatif) Si votre script est appelé par un autre script qui s'appelle etc, il est bon d'avoir le nom de script $0 dans chaque message d'erreur. (Facultatif) Vous pouvez rompre une longue ligne de commande avec une barre oblique inverse à la fin de la ligne.
+0

merci beaucoup, j'ai raison, je réécris ce script de DOS) – slavig

+0

Hell mec mec cool!) – slavig

2

Goto, vraiment?

modifier votre instruction if pour ajouter un point-virgule avant fi

if [$JAVA_HOME = ""]; then goto no_java_home ; fi 

par exemple.

Votre shell ne peut pas faire la distinction entre la commande no_java_home et la commande fi car ils sont apparus sur la même ligne sans délimiteur de point virgule ni autre chose qui mettrait fin à une instruction. Vous avez le même problème sur vos lignes avec un écho clair; aussi loin que sh est concerné echo ici est utilisé comme argument pour effacer et n'est pas une commande séparée.

Mais s'il vous plaît, réécrivez ceci sans utiliser goto!

Comme ceci:

if [$JAVA_HOME = ""] ; then 
     clear 
     echo "You should set the JAVA_HOME environment variable" 
elif [$SRV_HOME = ""] ; then 
     clear 
     echo "You should set the TMX_HOME environment variable. For example: TMX_HOME=d:\MYSERVER" 
else 
     echo Uses JAVA_HOME=$JAVA_HOME 

     echo Uses SRV_HOME=$SRV_HOME 

     export ACP="" 

     export ACP=$ACP;$JAVA_HOME/lib/tools.jar 

     export ACP=$ACP;$SRV_HOME/ant/lib/ant.jar 

     export ACP=$ACP;$SRV_HOME/ant/lib/ant-launcher.jar 

     export ACP=$ACP;$SRV_HOME/ant/lib/ant-nodeps.jar 

     export ACP=$ACP;$SRV_HOME/ant/lib/optional.jar 

     export ACP=$ACP;$SRV_HOME/ant/lib/ant-contrib-1.0b3.jar 

     $JAVA_HOME/bin/java -Xmx512m -classpath $ACP org.apache.tools.ant.Main -buildfile 

     $SRV_HOME/ant/ant_script.xml %* 
fi 

echo "OK" 
+0

merci beaucoup, je déteste goto – slavig

0

Si je réécris différemment les lignes suivantes, la fin inattendue d'erreur de fichier se éteint.

ligne d'origine:

if [$JAVA_HOME = ""]; then goto no_java_home fi  
if [$SRV_HOME = ""]; then goto no_srv_home fi 

Mise à jour:

if [$JAVA_HOME = ""]; then 
    goto no_java_home 
fi 

if [$SRV_HOME = ""]; then 
    goto no_srv_home 
fi 
Questions connexes