首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash脚本,第30行:语法错误:文件意外结束

bash脚本,第30行:语法错误:文件意外结束
EN

Stack Overflow用户
提问于 2010-10-27 18:15:00
回答 3查看 8.7K关注 0票数 2

我写了一些脚本,并有意外的文件结尾

代码语言:javascript
复制
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"

我的问题在哪里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-28 08:13:03

您的问题是,您的脚本看起来像是bash和cmd语法的随意混合。这是一个bash脚本。

代码语言:javascript
复制
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具有结构化编程构造(块、条件、循环)。它没有goto。
  • 测试命令[ … ]需要在括号的两边都有空格(除了标点符号,如;).
  • All变量替换($foo)应该在双引号中(否则,如果变量的值包含特定的特殊字符,如goto消息应该显示在错误输出上:echo 1>&2 "this is an error message" ),外壳程序将做一些奇怪的事情。(这也适用于cmd脚本。)
  • 如果发生错误,脚本应返回非零状态。(这也适用于cmd脚本)。由于environment.
  • ;是内部脚本变量,因此不需要将其导出到
  • 中。ACP是特殊字符,所以当你想在string.
  • (Optional)中使用它时,它必须加引号。如果你的脚本被另一个叫做"$@".
  • (Optional)的脚本调用,
  • Cmd的%*就是bash的etc。在每个错误message.
  • (Optional)中都有脚本名称$0是很好的做法,您可以在行尾使用反斜杠来中断一个很长的命令行。
票数 4
EN

Stack Overflow用户

发布于 2010-10-27 19:14:06

Goto,真的吗?

更改if语句以在fi之前添加分号

代码语言:javascript
复制
if [$JAVA_HOME = ""]; then goto no_java_home ; fi

例如。

您的shell无法区分no_java_home命令和fi命令,因为它们出现在同一行中,没有分号分隔符或任何可以结束语句的内容。使用clear echo的代码行也有同样的问题;就sh而言,这里使用echo作为清除命令的参数,而不是一个单独的命令。

但是,请在不使用goto的情况下重写此代码!

如下所示:

代码语言:javascript
复制
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"
票数 2
EN

Stack Overflow用户

发布于 2010-10-27 19:29:45

如果我以不同的方式重写以下行,意外的文件结束错误就会消失。

原始行:

代码语言:javascript
复制
if [$JAVA_HOME = ""]; then goto no_java_home fi    
if [$SRV_HOME = ""]; then goto no_srv_home fi 

更新:

代码语言:javascript
复制
if [$JAVA_HOME = ""]; then 
  goto no_java_home 
fi

if [$SRV_HOME = ""]; then 
  goto no_srv_home 
fi 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4032089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档