意外令牌附近的语法错误`do'

时间:2014-07-11 09:12:49

标签: 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

写完这些专栏后,我写了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文件相关的教程请建议我。

2 个答案:

答案 0 :(得分:2)

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

例如:

call setenv.bat

将在您的脚本中运行setenv.bat并将控件返回到当前脚本。但是:

./setenv.sh

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

. ./setenv.sh

OR

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 $*

无论传递多少目标,$*都会有效。

答案 1 :(得分:0)

这可能是你想要它做的:

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