[20201109]here-doc(EOF) in bash.txt

lfree發表於2020-11-09

[20201109]here-doc(EOF) in bash.txt

--//在bash shell使用her-doc個人習慣使用EPF作為結束符,自己工作中經常犯一些小錯誤,做一些例子:

1.方法一:
sqlplus -s -l scott/book <<EOF
select * from dept;
quit
EOF

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

--//這是最常用的方式,這樣的方式最大問題就是最後EOF必須頂到頭,前面不能有tab或者空格。

2.方法二:

sqlplus -s -l scott/book <<-EOF
select * from dept;
quit
    EOF

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO:
        40 OPERATIONS     BOSTON
--//如果結束EOF前面有空格,前面必須使用-EOF.
--//並且如果手工輸入命令,它不會自動執行,必須在結尾加入ctrl+D,例子:

$ sqlplus -s -l scott/book <<-EOF
> select count(*) from dept;
> quit
>  EOF
>
>
  COUNT(*)
----------
         4
--//結尾EOF輸入不會執行,必須按ctrl+D,不建議採用這樣的書寫模式。並且結束前最好加入quit退出命令對於sqlplus。

sqlplus -s -l scott/book <<-EOF
select * from dept;
  EOF

$ sqlplus -s -l scott/book <<-EOF
> select * from dept;
>   EOF
>
>
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SP2-0042: unknown command "EOF" - rest of line ignored.
--//報SP2-0042錯誤。

sqlplus -s -l scott/book <<-EOF
select * from dept;
EOF

$ sqlplus -s -l scott/book <<-EOF
> select * from dept;
> EOF

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

--//不會報錯。

3.方法3:
--//轉義問題:
sqlplus -s scott/book <<EOF
$(seq 1 3| xargs -i{}  echo  select sysdate from dual \; )
quit
EOF
--//分號必須轉義。

$ sqlplus -s -l scott/book <<EOF
> set numw 12
> select current_scn from v$database ;
> EOF
select current_scn from v
                        *
ERROR at line 1:
ORA-04044: procedure, function, package, or type is not allowed here
--//$database被當作變數。給EOF加入引號就可以避免這個錯誤,不然也要使用\轉義.

$ sqlplus -s -l scott/book << 'EOF'
> set numw 12
> select current_scn from v$database ;
> quit
> EOF

 CURRENT_SCN
------------
 13304164054

$ sqlplus -s -l scott/book << EOF
> set numw 12
> select current_scn from v\$database ;
> quit
> EOF

 CURRENT_SCN
------------
 13304164077

4.總結:
--//實際上這些都是一些很細節的問題,工作中有時候遇到。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2732891/,如需轉載,請註明出處,否則將追究法律責任。

相關文章