目录
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 还有一个用法就是将
‘<<‘ 变为 ‘<<-‘
。
使用 <<- 的唯一变化就是
H
er
e 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
本文主要参考了一下文章,并进行相关修改: