繁体   English   中英

运行shell脚本时`newline'意外

[英]`newline' unexpected when run shell script

我是unix命令的新手。 我想执行jasper文件P70152R1,并将busDt参数传递给该文件。 当前遇到此错误>>> 第51行:第53行的语法错误:'newline'意外

谁能帮我检查一下我的shell脚本。

下面是我的脚本:

echo "*********************************************************"
echo "*         xxxxxxxxxxxxxxxxxxxxxxxxx                     *"
echo "*********************************************************"
echo
echo "*********************************************************************************"
echo "*                 xxxxxxxxxxxxxxxxxxxxxxxx                  *"
echo "*                            UP                             *"
echo "*     P700152R1 - AAAAAAAAAAAAAAAAAAA REPORT            *"
echo "*     P700152R2 - BBBBBBBBBBBBBBBBBBB REPORT        *"
echo "*     P700152R3 - CCCCCCCCCCCCCCCCCCC REPORT            *"
echo "*                           (JP700152)                          *"
echo "*                        FREQUENCY : DAILY                          *"
echo ****************************************************************************"
echo
cd $MAIN/CWJCL/ACQ
export JCL=$MAIN/CWJCL/ACQ
export PRM=$MAIN/CWPRM/ACQ:$MAIN/CWPRM/CMN
export JAS=$MAIN/CWRPT/ACQ
export rptDir=$MAIN/ACQ/DAILYRPT
export LOG=$MAIN/CWLOG/ACQ

echo "Start Time and Date : \c" &&date
echo
JP70152=`date +%Y%m%d%H%M%S`
$JCL/strtJob $JP70152 JP70152

# Classpath
. $JCL/SETENV
#export CLASSPATH=$CLASSPATH:$PRM:$LIB/acq-1.0.jar
export CLASSPATH=$CLASSPATH:$PRM:"$MAIN/CWLIB/classes/acq"

# Get Business Date
echo "set heading off;" > $LOG/busDtSel.sql
echo "spool $LOG/date.log;" >> $LOG/busDtSel.sql
echo "ALTER SESSION SET CURRENT_SCHEMA=CCPS;" >> $LOG/busDtSel.sql
echo "SELECT 'CURRENT-BUSS-DATE:'||F9_AP008_BUS_DT FROM AP008;" >> $LOG/busDtSel.sql
echo "spool off;" >> $LOG/busDtSel.sql
echo "EXIT;" >> $LOG/busDtSel.sql
echo
$JCL/CONNAM.sh $LOG/busDtSel.sql $LOG/sel_day
a=$?
if [ ! $a -eq 0 ]
then
   return $a
fi

tmpDt=`grep CURRENT-BUSS-DATE $LOG/date.log`
busDt=${tmpDt##*:}

# run program.
yyyymmdd=`date +%Y%m%d`
$JAVA_HOME/bin/java my.com.eprotea.report.JRGenerator -Ttxt -J$JAS/P70152R1.jasper -DACQ -O$rptDir/P70152R1.rpt -P<BUS-DATE:$busDt>
##########$JAVA_HOME/bin/java my.com.eprotea.report.JRGenerator -Ttxt -J$JAS/P70152R2.jasper -DACQ -O$rptDir/P70152R2.rpt -P<BUS-DATE:$busDt>
##########$JAVA_HOME/bin/java my.com.eprotea.report.JRGenerator -Ttxt -J$JAS/P70152R3.jasper -DACQ -O$rptDir/P70152R3.rpt -P<BUS-DATE:$busDt>
a=$?
echo $a
if [ ! $a -eq 0 ]
then
   return $a
fi
echo
echo
echo
$JCL/endJob $JP70152 JP70152
echo "End Time and Date : \c" &&date
echo
return $a

非常感谢您的帮助。 谢谢id提前!

<>字符在bash中具有特殊含义。 您曾在

echo "set heading off;" > $LOG/busDtSel.sql

将回显的输出重定向到$LOG/busDtSel.sql

在第53行中,您将执行以下操作:

$JAVA_HOME/bin/java my.com.eprotea.report.JRGenerator options -P<BUS-DATE:$busDt>

这意味着, JRGenerator的最后一个参数是-P ,stdin来自文件BUS-DATE:$busDt ,而stdout没什么用。 有换行符。 对于bash而言,这是意外的,因为它希望将stdout作为目标。 因此,错误消息。

解决方案是使用引号:

$JAVA_HOME/bin/java my.com.eprotea.report.JRGenerator options "-P<BUS-DATE:$busDt>"

您的脚本中还有其他问题; 例如:有一行:

echo ************************************"

显然应该是:

echo "************************************"

我认为将脚本放入问题中可能是一个错误,因为这会为我生成不同的错误消息。

您忘了在行首添加" ,因此搞砸了所有内容:

        echo "*********************************************************************************"
        echo "*                 xxxxxxxxxxxxxxxxxxxxxxxx                  *"
        echo "*                            UP                             *"
        echo "*     P700152R1 - AAAAAAAAAAAAAAAAAAA REPORT            *"
        echo "*     P700152R2 - BBBBBBBBBBBBBBBBBBB REPORT        *"
        echo "*     P700152R3 - CCCCCCCCCCCCCCCCCCC REPORT            *"
        echo "*                           (JP700152)                          *"
        echo "*                        FREQUENCY : DAILY                          *"
HERE -> echo ****************************************************************************"

嗨,您正在Java命令末尾使用>运算符。 更好地使用转义序列来克服此问题。 请参见下面的正确表达式。

$JAVA_HOME/bin/java my.com.eprotea.report.JRGenerator -Ttxt -J$JAS/P70152R1.jasper -DACQ -O$rptDir/P70152R1.rpt -P\<BUS-DATE:$busDt\>

或者,您可以按照他的回答中提供的Ljm的方法尝试以下操作:

$JAVA_HOME/bin/java my.com.eprotea.report.JRGenerator -Ttxt -J$JAS/P70152R1.jasper -DACQ -O$rptDir/P70152R1.rpt "-P<BUS-DATE:$busDt>" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM