Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash脚本,第30行:语法错误:意外的文件结尾_Linux_Bash_Shell - Fatal编程技术网

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命令
    […]
    要求括号两侧各有空格(标点符号除外,如
  • 所有变量替换(
    $foo
    )都应该用双引号引起来(否则,如果变量的值包含某些特殊字符,例如空格,shell将执行奇怪的操作)
  • 错误信息应显示在错误输出上:
    echo 1>&2“这是一条错误信息”
    。(这也适用于cmd脚本。)
  • 如果发生错误,脚本应返回非零状态。(这也适用于cmd脚本。)
  • 由于
    ACP
    是一个内部脚本变量,因此无需将其导出到环境中
  • 是一个特殊字符,因此当您想在字符串中使用它时,它必须被引用
  • (可选)可以避免在循环中多次重复同一字符串(bash中的循环没有cmd中的疯狂限制)
  • Cmd的
    %*
    是bash的
    “$@”
  • (可选)如果您的脚本被另一个名为etc的脚本调用,最好在每个错误消息中都有脚本名
    $0
  • (可选)您可以在命令行末尾使用反斜杠打断长命令行

    • Bash没有
      goto
      echo off
      ,您必须在
      [
      之后和
      ]
      之前添加空格。您可能不需要导出
      ACP
      变量,因为它是作为参数传递的(Java是否在其环境中查找它?)。