shell脚本中的EOF命令问题

时间:2017-07-01 09:05:04

标签: oracle shell stored-procedures

我有一个代码片段,如下所示。

if [ $output -le 0 ]
then
    echo 'no data present'
    echo "$ORACLEHOME/bin/sqlplus -s $DBUSER/$DBPASSWORD"
    $ORACLEHOME/bin/sqlplus -s $DBUSER/$DBPASSWORD <<EOF
    set serverout on 
    set linesize 1000
    set feedback off
    BEGIN
    DBMS_OUTPUT.PUT_LINE('inserting into mig_log');
    INSERT INTO ROAMING_LOG VALUES(SYSDATE,'NEW RECORD CREATION IN BSCS',0,0,0,0,0,'No new Roaming Partner created.','N');
    COMMIT;
    END;
    /
    EOF
    echo 'data inserted'
    echo 'mail to sent'
    echo -e "$BODY4"| mailx -s "$SUBJECT" ${TO_ADDRESS} -- -r ${FROM_ADDRESS}
    echo 'mail sent'
fi 

此代码段抛出错误

  

&#34; SP2-0042:未知命令&#34; EOF&#34; - 其余的行被忽略。&#34;

任何帮助将不胜感激..

3 个答案:

答案 0 :(得分:4)

语法称为&#34; here document&#34;,并要求结束文档的整行等于用于启动文本的分隔符块。因此,要在任何外壳中工作,您必须对EOF行进行修改或将分隔符更改为' EOF'

答案 1 :(得分:1)

结尾标记EOF不应缩进。所以你需要将代码更改为

    $ORACLEHOME/bin/sqlplus -s $DBUSER/$DBPASSWORD <<EOF
    #some stuff here
EOF

如果您希望缩进heredoc的结束标记,并且如果您正在使用GNU-Bash,则可以使用<<-

$ORACLEHOME/bin/sqlplus -s $DBUSER/$DBPASSWORD <<-EOF
    #some stuff here
    EOF

答案 2 :(得分:0)

使用这种脚本的简单方式

L=$(ORACLEHOME/bin/sqlplus -s $DBUSER/$DBPASSWORD <<EOF
    #some stuff here
EOF)