2010-10-27 59 views
2

I`v寫了一些劇本意外結束,並有文件bash腳本,第30行:語法錯誤:文件

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" 

哪裏是我的問題的意外的結束?

+0

Bash沒有'goto'或'echo off',你必須在''''之前和''''後面放一個空格。你可能不需要'輸出'ACP變量,因爲它是作爲參數傳遞的(Java是否在它的環境中尋找它?)。 – 2010-10-27 14:54:14

回答

4

你的問題是,你的腳本看起來像bash和CMD語法的隨意組合。這是一個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]" 

這裏的事情列出來我已經糾正:

  • bash有結構化編程結構(塊,條件,循環)。它沒有轉到。
  • 測試命令[ … ]需要在支架的每一側的空間(除了與像;標點)。
  • 所有變量替換($foo)應該是在雙引號(否則shell會做奇怪的事情,如果變量的值包含某些特殊字符,例如空格)。
  • 錯誤消息應顯示在錯誤輸出上:echo 1>&2 "this is an error message"。 (這也適用於cmd腳本。)
  • 如果發生錯誤,腳本應返回非零狀態。 (這將適用於一個CMD腳本也是如此。)
  • 由於ACP是一個內部腳本變量,也沒有必要將其導出到環境中。
  • ;是一個特殊字符,所以必須當你想在字符串中使用它被引用。
  • (可選)可避免與循環重複相同的字符串很多次(在bash循環沒有他們在cmd中有瘋狂的限制)。
  • Cmd的%*是bash的"[email protected]"
  • (可選)如果您的腳本被稱爲etc的另一個腳本調用,那麼在每個錯誤消息中都有腳本名稱$0是很好的。
  • (可選)您可以在行尾使用帶反斜槓的長命令行。
+0

thanx很多,對吧,我從DOS改寫這個腳本) – slavig 2010-10-28 08:54:20

+0

地獄夥計你好酷!) – slavig 2010-10-28 09:01:46

2

轉到,真的嗎?

改變你的if語句連接

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

例如前添加一個分號。

你的shell無法執行,因爲他們在同一行上出現不分號分隔符或其他任何將結束語句no_java_home命令和網絡命令來區分。你的線路上有同樣的問題,回聲清晰;就sh而言,這裏的回顯被用作清除參數,而不是單獨的命令。

但是,請不要使用goto重寫這個!

像這樣:

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

thanx很多,我討厭goto – slavig 2010-10-27 13:35:41

0

如果我重寫以下行不同,文件錯誤的意外結束熄滅。

原線路:

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

更新時間:

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

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