linux積累---關(guān)于linux特殊重定向的理解
什么是Here Document
Here Document 是在Linux Shell 中的一種特殊的重定向方式,它的基本的形式如下
- cmd << delimiter
- Here Document Content
- delimiter
它的作用就是將兩個(gè) delimiter 之間的內(nèi)容(Here Document Content 部分) 傳遞給cmd 作為輸入?yún)?shù)。
比如在終端中輸入cat << EOF ,系統(tǒng)會(huì)提示繼續(xù)進(jìn)行輸入,輸入多行信息再輸入EOF,中間輸入的信息將會(huì)顯示在屏幕上。如下:
- fish@mangos:~$ cat << EOF
- > First Line
- > Second Line
- > Third Line EOF
- > EOF
- First Line
- Second Line
- Third Line EOF
注: >這個(gè)符號(hào)是終端產(chǎn)生的提示輸入信息的標(biāo)識(shí)符
這里要注意幾點(diǎn)
- EOF 只是一個(gè)標(biāo)識(shí)而已,可以替換成任意的合法字符
- 作為結(jié)尾的delimiter一定要頂格寫,前面不能有任何字符
- 作為結(jié)尾的delimiter后面也不能有任何的字符(包括空格)
- 作為起始的delimiter前后的空格會(huì)被省略掉
- Here Document 不僅可以在終端上使用,在shell 文件中也可以使用,例如下面的here.sh 文件
- cat << EOF > output.sh
- echo "hello"
- echo "world"
- EOF
使用 sh here.sh 運(yùn)行這個(gè)腳本文件,會(huì)得到output.sh 這個(gè)新文件,里面的內(nèi)容如下
- echo "hello"
- echo "world"
Here Document的變形
delimiter 與變量
在Here Document 的內(nèi)容中,不僅可以包括普通的字符,還可以在里面使用變量,例如將上面的here.sh 改為
- cat << EOF > output.sh
- echo "This is output"
- echo $1
- EOF
使用sh here.sh HereDocument 運(yùn)行腳本得到output.sh的內(nèi)容
- echo "This is output"
- echo HereDocument
在這里 $1 被展開(kāi)成為了腳本的參數(shù) HereDocument
但是有時(shí)候不想展開(kāi)這個(gè)變量怎么辦呢,可以通過(guò)在起始的 delimiter的前后添加 " 來(lái)實(shí)現(xiàn),例如將上面的here.sh 改為
- cat << "EOF" > output.sh #注意引號(hào)
- echo "hello"
- echo "world"
- EOF
得到的output.sh 的內(nèi)容為
- echo "This is output"
- echo $1
<< 變?yōu)?<<-
Here Document 還有一個(gè)用法就是將 '<<' 變?yōu)?'<<-'。 使用 <<- 的唯一變化就是Here Document 的內(nèi)容部分每行前面的 tab (制表符)將會(huì)被刪除掉,這種用法是為了編寫Here Document的時(shí)候可以將內(nèi)容部分進(jìn)行縮進(jìn),方便閱讀代碼。