Bash 意外标记“do'”附近出现语法错误;

Bash 意外标记“do'”附近出现语法错误;,bash,shell,batch-file,Bash,Shell,Batch File,我正在尝试将.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

我正在尝试将.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
在写了这些行之后,我写了
chmod755./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文件相关的教程,请向我推荐。

这可能是您希望它的方式:

#!/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 "$@"?

bashshell和Batch是两种完全不同的编程语言,它们有自己的语法和工作方式

例如:

call setenv.bat
将在脚本中运行
setenv.bat
,并将控件返回到当前脚本。然而:

./setenv.sh
将生成一个新的shell,在该shell中设置环境,然后返回到未设置这些环境变量的父shell。要在shell中执行等效操作,必须在
setenv.sh
中获取源代码:

. ./setenv.sh

第一个与所有伯恩样式的外壳兼容。最后一个更具可读性,但可能与不同的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脚本中。与批处理不同,它不影响父shell,因此使用
$CLASSPATH
就可以了

最后:

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

无论传递了多少个目标,
$*
都将工作。

可能
导出_LIBJARS=$(用于…)
。我不明白你想在第三行做什么。。。似乎您想将bat文件的输出放入_LIBJARS中。@DavidWallace先生,如果我省略分号,我会得到如下错误。/build.sh:line 3:export:
[$/lib/*.jar]do':不是有效标识符。/build.sh:第3行:导出:
$/bin/append.bat':不是有效标识符1外壳变量未在末尾使用
$
写入。2
source[…]。bat
看起来像是在自找麻烦,3@Hastur可能是对的,并且还添加了一个
done
。4 for循环在很多方面都是错误的,也许你应该从shell/Bash教程开始。为什么你需要
source
你的bat文件?执行它还不够吗?当您
source
时,脚本在某种程度上就像您在脚本的源位置编写代码一样@比芬指出这一点很麻烦。我们不知道append.bat的行为如何,也不知道它是否需要在新的shell中启动。
*.jar
是否需要放在关闭
或者它是以任何一种方式工作的吗?在引号中,
*
是按字面意思处理的,而不是作为一个glob。@chepner:对,谢谢。我以为只有单引号起作用——我一定是记错了。谢谢它起作用了,但需要在
CLASSPATH=“$CLASSPATH:$jar”
之前添加export关键字。我应该更仔细地查看批处理脚本。通常,在构建
$CLASSPATH
时,您会在下面的命令中使用它。我现在知道你不是。
$ANT_HOME/bin/ant -buildfile $XYZ_HOME/build.xml $*