here 文档
here文档
Linux的Here DOC即为Here 文档,是一种特殊的程序区域,可以用来设置变量等操作、向一条命令传递输入。它使用I/O重定向的形式将一个命令序列传递到一个交互程序或者命令中。它允许一条命令在获得输入数据时就好像是在读取一个文件或键盘一样,而实际是从脚本程序中得到输入数据。
基本的格式:
命令 << 标记
内容....
.....
标记
说明:上面的位于两个标记之间的内容即为Here文档的内容,可以被看成是一个多行的字符串。'<<'符号表示将Here Doc的内容提交给指定的命令处理。标记可以为任意字符串,但是一般是选择不常用的字符组合,避免该字符串在输入的内容中从而造成Bash错误判断Here文档的范围。Here Doc支持变量替换(类似用双引号一样)
用法
打印
使用cat打印多行消息,也可重定向:
cat <<EOF > /tmp/test
this is here doc!
date
$HOME
EOF
带有抑制tab功能的多行消息(去掉每行前面的TAB字符):
cat <<-EOF
this is here doc!
date doesn't work
EOF
关闭变量替换的功能
cat <<'EOF'
$HOME
doesn't work here!
EOF
设置变量
使用Here Doc来设置变量:
str=$(cat <<EOF
line 1
line 2
EOF)
脚本交互
也可以用here文档用在shell脚本,做简单的自动交互。替代简单的expect脚本。
#!/bin/bash
#这个函数看起来就是一个交互函数, 但是...
GetPersonalData ()
{
read firstname
read lastname
read address
}
# 给上边的函数提供输入.
GetPersonalData <<DATA
Robert
Bozeman
Hust
DATA
“隐匿”here doc
把here文档前面的命令改成冒号(:),就生成了“隐匿”here文档。它可以用来注销一段代码,比#好用的是不用在每一行前添加。此外,关于这种小技巧的另一个应用就是能够产生自文档化(self-documenting)的脚本。下面就是这种脚本:
#!/bin/bash
# self-document.sh: 自文档化(self-documenting)的脚本
# Modification of "colm.sh".
DOC_REQUEST=70
if [ "$1" = "-h" -o "$1" = "--help" ] # 请求帮助。sed命令把here文档过滤出来,然后通过管道传给下一个sed
then
echo; echo "Usage: $0 [directory-name]"; echo
sed --silent -e '/DOCUMENTATIONXX$/,/^DOCUMENTATIONXX$/p' "$0" |
sed -e '/DOCUMENTATIONXX$/d'; exit $DOC_REQUEST; fi
: <<DOCUMENTATIONXX
List the statistics of a specified directory in tabular format.
---------------------------------------------------------------
The command line parameter gives the directory to be listed.
If no directory specified or directory specified cannot be read,
then list the current working directory.
DOCUMENTATIONXX
if [ -z "$1" -o ! -r "$1" ]
then
directory=.
else
directory="$1"
fi
echo "Listing of "$directory":"; echo
(printf "PERMISSIONS LINKS OWNER GROUP SIZE MONTH DAY HH:MM PROG-NAME\n" \
; ls -l "$directory" | sed 1d) | column -t
exit 0
使用cat 脚本 也能够完成相同的目的:
DOC_REQUEST=70
if [ "$1" = "-h" -o "$1" = "--help" ] # 请求帮助.
then # 使用"cat 脚本" . . .
cat <<DOCUMENTATIONXX
List the statistics of a specified directory in tabular format.
---------------------------------------------------------------
The command line parameter gives the directory to be listed.
If no directory specified or directory specified cannot be read,
then list the current working directory.
DOCUMENTATIONXX
exit $DOC_REQUEST
fi
注意事项
某些工具是不能放入here document中运行。
结尾的limit string, 就是here document最后一行的limit string, 必须从第一个字符开始.。它的前面不能够有任何前置的空白。而在这个limit string后边的空白也会引起异常. 空白将会阻止limit string的识别。
对于那些使用"here document", 并且非常复杂的任务, 最好考虑使用expect脚本语言, 这种语言就是为了达到向交互程序添加输入的目的而量身定做的。
发现一个内容不错的论坛“内存溢出”。上面许多例子就是应用自该论坛,参见链接。