在shell脚本程序中向一条命令传递输入的一种特殊方法是使用here文档,它允许一条命令在获得输入数据时就好像是在读取一个文件或键盘一样,而实际上是从脚本程序中得到输入数据。
here文档以两个连续的小于号<<开始,紧跟着一个特殊的字符序列,该字符序列在文档结尾处再次出现。<<是shell的标签重定向符,在这里,它强制命令的输入是一个shell文档。这个特殊字符序列的作用就像一个标记,它告诉shell here文档结束的位置。因为这个标记序列不能出现在传递给命令的文档内容中,所以应该尽量使它即容易记忆有相当不寻常。
cat <
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 <
3
d
. ,\/is/was/
w
q
<
exit 0
运行这个脚本程序,现在这个文件的内容是:
That is line 1
That is line 2
That was line 4
实验分析:
这个脚本程序只是在调用ed编辑器并向它传递命令,先让他移动到第三行,然后删除该行,再把当前行(因为第三行刚刚被删除,所以当前行就是原来最后一行,即第四行)中is替换was。完成这些操作的ed命令来自脚本程序中的here文档——在标记!FUNKYStuff!之间的那些内容。