here 文档

作者: awsome365 | 来源:发表于2019-05-17 17:18 被阅读0次

    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脚本语言, 这种语言就是为了达到向交互程序添加输入的目的而量身定做的。

    发现一个内容不错的论坛“内存溢出”。上面许多例子就是应用自该论坛,参见链接

    相关文章

      网友评论

        本文标题:here 文档

        本文链接:https://www.haomeiwen.com/subject/rqgoaqtx.html