在第34行得到语法错误:`<<'在ksh脚本中无与伦比

时间:2013-11-25 07:19:16

标签: shell sqlplus ksh

我有一个shell脚本,当我执行它时,我收到错误

syntax error at line 34 : `<<' unmatched in ksh script

column_name=`sqlplus -s $BASE_DB_CONN<<!!
    WHENEVER SQLERROR exit ROLLBACK
    set SQLPROMPT ''
    set heading off
    set pagesize 1000
    set linesize 5000
    set feedback off
    set define on
    set verify off
    @smm9_stream_map.sql $STREAM_NAME $FIELD_NAME"
    exit
    !!`;

令我惊讶的是,同样的事情在while循环更改脚本中起作用,如下所示

while [ $a -lt ${NO_LOOP} ]
do
column_name=`sqlplus -s $BASE_DB_CONN<<!!
    WHENEVER SQLERROR exit ROLLBACK
    set SQLPROMPT ''
    set heading off
    set pagesize 1000
    set linesize 5000
    set feedback off
    set define on
    set verify off
    @smm9_stream_map.sql $STREAM_NAME $FIELD_NAME"
    exit
    !!`;
a=`expr $a + 1`
done

为什么第二个脚本有效但不是第一个?

1 个答案:

答案 0 :(得分:2)

heredoc终结符必须是该行的唯一文本,不允许其他空格(*)

column_name=$(sqlplus -s $BASE_DB_CONN<<!!
    ....
    exit
!!
)

(*)例外情况是,对于使用<<-的heredoc,任何前导标签都将从heredoc中剥离,包括从终结符中删除。我在ksh93手册中看到了:

  

如果附加到&lt;&lt;,则会显示前导空格和制表符                        剥离文档的第一行,最多相当于缩进                        从剩余的行和单词中删除。