SHELL 中分界符(EOF)的用法


在shell腳本中,通常將EOF與 << 結合使用,表示后續的輸入作為子命令或子Shell的輸入,直到遇到EOF為止,再返回到主Shell。

EOF( 即 end of file )只是一個分界符,當然也可以用abcde替換。
當shell遇到<<時,它知道下一個詞是一個分界符。在該分界符以后的內容都被當作輸入,直到shell又看到該分界符(位於單獨的一行)。
此分界符可以是所定義的任何字符串,其實,不一定要用EOF,只要是“內容段”中沒有出現的字符串,都可以用來替代EOF,完全可以換成abcde之類的字符串,只是一個起始和結束的標志罷了。

1,command<<EOF
(內容)
EOF
例如:
 <<是輸入重定向,將EOF中間的內容讓cat命令讀取

 

2,特殊用法:
: << COMMENTBLOCK
   shell腳本代碼段
COMMENTBLOCK
用來注釋整段腳本代碼。 : 是shell中的空語句。
 

echo start
:<<COMMENTBLOCK
echo
echo "this is a test"
echo
COMMENTBLOCK
echo end

這段腳本執行時,中間部分不會被執行:
 

復制代碼 代碼示例:
[root@newserver shell]# sh eof.sh
start
end

 

cat <<EOF 與 cat <<-EOF 的區別:

 

兩個都是獲取stdin,並在EOF處結束stdin,輸出stdout。

但是<<-是什么意思呢?

先來看man中的說明:

If the redirection operator is <<-, tan all leading tab characters are stripped from input lines and  the  line  containing  delimiter.   

翻譯過來的意思就是:如果重定向的操作符是<<-,那么分界符(EOF)所在行的開頭部分的制表符(Tab)都將被去除。

這可以解決由於腳本中的自然縮進產生的制表符。

通俗一點的解釋:

在我們使用cat <<EOF時,我們輸入完成后,需要在一個新的一行輸入EOF結束stdin的輸入。EOF必須頂行寫,前面不能用制表符或者空格。

比如,下面的語句就不會出錯:

cat <<EOF
Hello,world!
EOF


如果結束分界符EOF前有制表符或者空格,則EOF不會被當做結束分界符,只會繼續被當做stdin來輸入。

而<<-就是為了解決這一問題:


cat <<-EOF
Hello,world!
  EOF


上面的寫法,雖然最后的EOF前面有多個制表符和空格,但仍然會被當做結束分界符,表示stdin的結束。
這就是<<和<<-的區別。


原文鏈接: 

     https://blog.csdn.net/apache0554/article/details/45508631

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM