Linux bash脚本,第30行:语法错误:意外的文件结尾
我写了一些脚本,但意外地结束了文件Linux bash脚本,第30行:语法错误:意外的文件结尾,linux,bash,shell,Linux,Bash,Shell,我写了一些脚本,但意外地结束了文件 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=$A
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"
我的问题在哪里?去吧,真的吗
更改if语句,在fi之前添加分号
if [$JAVA_HOME = ""]; then goto no_java_home ; fi
比如说
您的shell无法区分no_java_home命令和fi命令,因为它们出现在同一行,没有分号分隔符或任何其他可以结束语句的内容。你的线路也有同样的问题,回音清晰;就sh
而言,这里的echo用作清除的参数,而不是单独的命令
但是请不要使用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"
如果我以不同的方式重写以下行,则会出现意外的文件结尾错误 原始行:
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
您的问题是,您的脚本看起来像是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" \
"$@"
以下是我已更正的事项列表:
- Bash具有结构化编程结构(块、条件、循环)。它没有后路
- test命令
要求括号两侧各有空格(标点符号除外,如[…]
);
- 所有变量替换(
)都应该用双引号引起来(否则,如果变量的值包含某些特殊字符,例如空格,shell将执行奇怪的操作)$foo
- 错误信息应显示在错误输出上:
。(这也适用于cmd脚本。)echo 1>&2“这是一条错误信息”
- 如果发生错误,脚本应返回非零状态。(这也适用于cmd脚本。)
- 由于
是一个内部脚本变量,因此无需将其导出到环境中ACP
是一个特殊字符,因此当您想在字符串中使用它时,它必须被引用- (可选)可以避免在循环中多次重复同一字符串(bash中的循环没有cmd中的疯狂限制)
- Cmd的
是bash的%*
“$@”
- (可选)如果您的脚本被另一个名为etc的脚本调用,最好在每个错误消息中都有脚本名
$0
- (可选)您可以在命令行末尾使用反斜杠打断长命令行
- Bash没有
goto
或echo off
,您必须在[
之后和]
之前添加空格。您可能不需要导出ACP
变量,因为它是作为参数传递的(Java是否在其环境中查找它?)。