目录
1、什么是Here Document
Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下
cmd << HERE
Document Content #一段信息
HERE
它的作用就是将两个 HERE之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数。其中HERE相当于标记,可以是任何的字符串。
比如在终端中输入cat << EOF
,系统会提示继续进行输入,输入多行信息再输入EOF后,两个EOF之间输入的信息将输出到标准输出,这里是终端。如下:
$ cat << HERE
> First Line
> Second Line
> Third Line
> HERE
First Line
Second Line
Third Line
注: >
这个符号是终端产生的提示输入信息的标识符
注意事项
- HERE只是一个标识而已,可以替换成任意的合法字符,比如 eof 等
- 作为结尾的HERE一定要顶格写,前面不能有任何字符
- 作为结尾的HERE后面也不能有任何的字符(包括空格)
- 作为起始的HERE前后的空格会被省略掉
2、cat + << here结合创建文件
Here Document 与cat命令结合,可用于创建一个新的文件,这个是cat命令非常常用的用法。
使用格式:
cat << HERE > filename
Document Content #一段信息
HERE
作用:HERE之间输入的信息将不回输出到标准输出,而是重定位到filename文件中,如果filename文件不存在,则会先创建此文件,再输入内容。
同时,上述命令可以在终端上直接使用,也可以在shell 脚本中使用,例如下面的here.sh 文件
cat << HERE > output.sh
echo "hello"
echo "world"
HERE
使用 sh here.sh
命令运行这个脚本文件,会得到output.sh 这个新文件,里面的内容如下:
echo "hello"
echo "world"
注意:“cat << HERE > filename” 中的 > 符号,表示的是覆盖式的写入,会将文件之中内容先删除再写入;如果想要追加式的写入,需要换成 >> 符号,格式:“cat << HERE >> filename” 。
关于cat 与Here Document的结合使用,可以参考博客:《linux下cat命令详解》
3、Here Document的变形
(3.1)HERE中的变量
在Here Document 的内容中,不仅可以包括普通的字符,还可以在里面使用变量,例如将上面的here.sh 改为
cat << HERE > output.sh
echo "This is output"
echo $1
HERE
运行命令:sh here.sh HereDocument
,然后查看output.sh的内容如下:
echo "This is output"
echo HereDocument
,因为,HereDocument是here.sh脚本的第一个参数,可以直接用shell中的特殊变量
$1表示,$1
被展开成为 HereDocument。
注意:如果不想HERE之间的变量自动展开,而是以字符串的形式正常输出,可以通过在起始的 HERE 的前后添加冒号 "
来实现,例如将上面的here.sh 改为
cat << "EOF" > output.sh
echo "This is output"
echo $1
EOF
得到的output.sh 的内容为:
echo "This is output"
echo $1
(3.2)<< 变为 <<-
Here Document 还有一个用法就是将 '<<' 变为 '<<-'。
使用 <<- 的唯一变化就是Here Document 的内容部分每行前面的 tab (制表符)将会被删除掉,这种用法是为了编写Here Document的时候可以将内容部分进行缩进,方便阅读代码。如:
cat <<- EOF > output.sh
echo "This is output"
echo $1
EOF
得到的output.sh 的内容为:
echo "This is output"
echo $1
但是如果使用的是 <<,那么output.sh 的内容会变为:
echo "hello"
echo "world"
echo 之前的tab 不会被删除!
4、参考链接
Wiki: Here Document
Learn Linux, 101: Streams, pipes, and redirects
本文主要参考了一下文章,并进行相关修改:
https://my.oschina.net/u/1032146/blog/146941#OSC_h3_3