我正在尝试将.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文件相关的教程请建议我。
答案 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 "$@"?