【问题标题】:syntax error near unexpected token `do'意外标记“do”附近的语法错误
【发布时间】:2014-09-01 20:46:55
【问题描述】:

我正在尝试将 .bat 文件转换为 .sh 文件,这是我的代码行

#!/bin/sh
./setenv.sh
export _LIBJARS=for i in [$XYZ_HOME$/lib/*.jar];do source $XYZ_HOME$/bin/append.bat i
export CLASSPATH=$ANT_HOME$/lib/ant.jar;$_LIBJARS$$ANT_HOME$/bin/ant -buildfile $XYZ_HOME$/build.xml $1 $2 $3 $4

写完这行之后,我写了chmod 755 ./build.sh 然后我写了./build.sh test-deploy

我收到以下错误:

./build.sh: line 3: syntax error near unexpected token `do'
./build.sh: line 3: `export _LIBJARS=for i in [$XYZ_HOME$/lib/*.jar];do source $XYZ_HOME$/bin/append.bat i'

我的 .Bat 文件是这样的

call setenv.bat

set _LIBJARS=
for %%i in (%XYZ_HOME%\lib\*.jar) do call %XYZ_HOME%\bin\append.bat %%i

set CLASSPATH=%ANT_HOME%\lib\ant.jar;%_LIBJARS%

%ANT_HOME%\bin\ant -buildfile %XYZ_HOME%\build.xml %1 %2 %3 %4

或任何了解代码行或与shell和bash文件相关的教程请建议我。

【问题讨论】:

  • 也许是export _LIBJARS=$(for ....)。我不明白你想在第三行做什么......看来你想把那个 bat 文件的输出放在 _LIBJARS 里面。
  • @DavidWallace Sir,如果我省略分号,我会收到如下错误 ./build.sh: line 3: export: [$/lib/*.jar]do': not a valid identifier ./build.sh: line 3: export: $/bin/append.bat': not a valid identifier
  • 1 Shell 变量最后没有写上$2 source [...].bat 貌似是自找麻烦,3 @Hastur 应该是对的,另外加个done4 for 循环在很多方面都是错误的,也许你应该从 shell/Bash 教程开始。
  • 你为什么需要source你的bat文件?执行还不够?当您source 时,某个脚本就好像您在获取它的脚本的位置编写它的代码一样。 @Biffen 在这一点上发现了麻烦。我们不知道 append.bat 的行为方式以及它是否需要在新的 shell 中启动。

标签: bash shell batch-file


【解决方案1】:

Bash Shell 和 Batch 是两种完全不同的编程语言,具有各自的语法和工作方式。

例如:

call setenv.bat

将在您的脚本中运行setenv.bat 并将控制权返回给您当前的脚本。然而:

./setenv.sh

将生成一个新的 shell,在该 shell 中设置环境,然后返回未设置这些环境变量的父 shell。要在 shell 中执行等效操作,您必须在setenv.shsource

. ./setenv.sh

source ./setenv.sh

第一个兼容所有 Bourne Style shell。最后一个可读性更好,但可能与不同的 shell 不兼容。

set _LIBJARS=
for %%i in (%XYZ_HOME%\lib\*.jar) do call %XYZ_HOME%\bin\append.bat %%i

set CLASSPATH=%ANT_HOME%\lib\ant.jar;%_LIBJARS%

在 Shell 中,您可以这样做:

export CLASSPATH=%ANT_HOME%\lib\ant.jar
for jar in ($XYZ_HOME/lib/*.jar)
do
    CLASSPATH="$CLASSPATH:$jar"
done

请记住,这只发生在这个 shell 脚本中。与 Batch 不同,它不会影响父 shell,所以使用 $CLASSPATH 就可以了。

最后:

$ANT_HOME/bin/ant -buildfile $XYZ_HOME/build.xml $*

无论通过多少个目标,$* 都会起作用。

【讨论】:

  • 谢谢它正在工作,但需要在CLASSPATH="$CLASSPATH:$jar" 之前添加导出关键字
  • 你是对的。我应该更仔细地查看批处理脚本。通常,当您构建$CLASSPATH 时,您会在随后的命令中使用它。我现在发现你不是。
【解决方案2】:

这可能是您希望的方式:

#!/bin/sh

. ./setenv.sh  # Must 'source' or else you won't get the values.
_LIBJARS=

for I in "$XYZ_HOME/lib/"*.jar; do
    . "$XYZ_HOME/bin/append.sh" "$I"
done

export CLASSPATH=$ANT_HOME/lib/ant.jar:$_LIBJARS
"$ANT_HOME/bin/ant" -buildfile "$XYZ_HOME/build.xml" "$1" "$2" "$3" "$4"  ## Or perhaps it should simply be "$@"?

【讨论】:

  • *.jar 是否需要放在关闭 " 之前,或者它是否可以工作?
  • 在引号内,* 被视为字面意思,而不是一个全局变量。
  • @chepner:好的,谢谢。我以为只有单引号才有这种效果——我一定是记错了。
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2012-08-31
  • 2012-10-20
  • 2012-09-29
相关资源
最近更新 更多