运行 shell 脚本时出现“换行符”意外

Posted

技术标签:

【中文标题】运行 shell 脚本时出现“换行符”意外【英文标题】:`newline' unexpected when run shell script 【发布时间】:2018-07-04 08:05:27 【问题描述】:

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

谁能帮我检查一下我的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

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

【问题讨论】:

如果这是一个 bash 脚本,那么行尾的 &gt; 可能会将其丢弃。也许您必须通过替换 -P&lt;BUS-DATE:$busDt&gt; 来编辑脚本? 这会有所帮助:shellcheck.net 嗨@RolandWeber。它奏效了。非常感谢您的帮助! 由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。 【参考方案1】:

&lt;&gt; 字符在 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 来说是出乎意料的,因为它期望标准输出的目的地。因此出现错误消息。

解决方案是使用引号:

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

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

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

显然应该是:

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

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

【讨论】:

是的,它现在可以工作了!非常感谢您的解释!第二期,是的,我错过了“。嗨。谢谢!:))【参考方案2】:

您忘记在行首添加",因此搞砸了一切:

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

【讨论】:

【参考方案3】:

您好,您在 java 命令末尾使用了&gt; 运算符。最好使用转义序列来克服这个问题。请看下面正确的表达方式。

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

【讨论】:

或者-P开关的参数语法真的是这样的,它只需要通过'"进行转义;或使用反斜杠转义 (\&gt;)。别忘了,还有一个&lt;也有特殊含义。 @dulange,你是对的,我只是忽略了第一个&lt;。谢谢 :-)。我已经更正了答案。

以上是关于运行 shell 脚本时出现“换行符”意外的主要内容,如果未能解决你的问题,请参考以下文章

[Python]_[初级]_[使用open函数生成文件需要注意换行符问题]

[Python]_[初级]_[使用open函数生成文件需要注意换行符问题]

操作系统版本捕获脚本 - 使用 awk 时出现意外结果

Linux-006-执行Shell脚本报错 $' ':command not found

shell脚本执行错误 $' ':command not found

从 shell 脚本运行 python 文件时出现 ModuleNotFoundError 错误