here文档是一种在命令行shell(如bash)和程序语言(像PHP等)中定义一个字串的方法。它可以保存字串里面的制表符,换行等空白字符,在某些语言中还允许在字串中进行变量替换和命令替换。
变量替换
变量替换就是取出变量的值,直接使用$符号加上变量名。如$varName
命令替换
命令替换是指shell执行命令并该命令替换为命令执行后的结果。命令替换有两种方式:
1.使用反引号
for i in `cd /old/code/dir ; echo *.c`
do
diff -c /old/code/dir/$i $i | more
done
2.使用$符号
for i in $(cd /old/code/dir ; echo *.c)
do
diff -c /old/code/dir/$i $i
done | more
注意:使用第一种方式时候,内嵌的 backtick 符号和双引号都需要进行转义。而使用第二种方式,内嵌的括号则无需转义。尽量使用第二种方式。
here最通用的用法就是<<后跟一个分隔字符串,从下一行开始就是想要引用的文字,然后再单独的一行用相同的分隔字符串关闭。例如
$ tr a-z A-Z <<END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES
END_TEXT
被用作标识符。注意:
- END_TEXT只是一个标识而已,可以替换成任意的合法字符
- 作为结尾的delimiter一定要顶格写,前面不能有任何字符
- 作为结尾的delimiter后面也不能有任何的字符(包括空格)
- 作为起始的delimiter前后的空格会被省略掉
在<<后面添加一个减号,可以使TAB字元被忽略。这允许在shell脚本中缩进here文档而不改变它们的值。
$ tr a-z A-Z <<-END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES
here文档中也会进行变量替换和命令替换:
在shell脚本中可以使用shell函数来创建自定义的命令,是一种很方便的方法。
bash,ksh或zsh中也可以用here-字串:
$ tr a-z A-Z <<<"Yes it is a string"
YES IT IS A STRING
参考资料