複製鏈接
請複製以下鏈接發送給好友

here文檔

鎖定
在shell腳本程序中向一條命令傳遞輸入的一種特殊方法是使用here文檔,它允許一條命令在獲得輸入數據時就好像是在讀取一個文件或鍵盤一樣,而實際上是從腳本程序中得到輸入數據。
中文名
here文檔
用    途
從腳本程序中得到輸入數據
所屬領域
計算機
here文檔以兩個連續的小於號<<開始,緊跟着一個特殊的字符序列,該字符序列在文檔結尾處再次出現。<<是shell的標籤重定向符,在這裏,它強制命令的輸入是一個shell文檔。這個特殊字符序列的作用就像一個標記,它告訴shell here文檔結束的位置。因為這個標記序列不能出現在傳遞給命令的文檔內容中,所以應該儘量使它即容易記憶有相當不尋常。
實例一:使用here文檔
最簡單的例子就是給cat命令提供輸入數據,如下所示:
#!/bin/sh
cat <<!FUNKY!
hello
this is a here
document
!FUNKY!
它的輸出如下所示:
hello
this is a here
document
here文檔功能開起來相當奇怪,但其實它的作用很大。因為它可以用來調用交互式的程序,比如一個編譯器,並向他提供一些事先定義好的輸入。但他更常見的用途是在腳本程序中輸入大量的文本,就像你剛才的示例中看到的那樣,從而可以避免用echo語句來輸出每一行,你可以在標識符兩端都是用感嘆號(!)來確保不會引起混淆。
如果想按預定義的方式處理一個文件中的幾行,你可以使用ed行編輯器,並在腳本程序中通過here文檔向它提供命令。
實驗二:here文檔的另一個用法
(1)我們從名為a_text_file的文件開始,它的內容如下所示:
That is line 1
That is line 2
That is line 3
That is line 4
(2)你可以通過結合使用here文檔和ed編輯器來編輯這個文件:
#!/bin/sh
ed a_text_file <<!FUNKYStuff!
3
d
. ,\$s/is/was/
w
q
<<!FUNKYStuff!
exit 0
運行這個腳本程序,現在這個文件的內容是:
That is line 1
That is line 2
That was line 4
實驗分析:
這個腳本程序只是在調用ed編輯器並向它傳遞命令,先讓他移動到第三行,然後刪除該行,再把當前行(因為第三行剛剛被刪除,所以當前行就是原來最後一行,即第四行)中is替換was。完成這些操作的ed命令來自腳本程序中的here文檔——在標記!FUNKYStuff!之間的那些內容。
[1] 
參考資料
  • 1.    [英]Neil Mtthew / Richard Stones.Linux程序設計中文.大陸:[英]Neil MtthewRichard Stones,2010年06月:61