在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中的空語句。
:<<COMMENTBLOCK
echo
echo "this is a test"
echo
COMMENTBLOCK
echo end
這段腳本執行時,中間部分不會被執行:
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的結束。
這就是<<和<<-的區別。
原文鏈接:
