我有一个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
为什么第二个脚本有效但不是第一个?
答案 0 :(得分:2)
heredoc终结符必须是该行的唯一文本,不允许其他空格(*)
column_name=$(sqlplus -s $BASE_DB_CONN<<!!
....
exit
!!
)
(*)例外情况是,对于使用<<-
的heredoc,任何前导标签都将从heredoc中剥离,包括从终结符中删除。我在ksh93手册中看到了:
如果#附加到&lt;&lt;,则会显示前导空格和制表符 剥离文档的第一行,最多相当于缩进 从剩余的行和单词中删除。