嵌入文档——here document

  • 配置文件
cat< file.config
write your config here
EOF
  • Here Documents的通常形式以下:
0001  commands <
0002     here documents 
.......     ...... 
000n  ID<\n> 
     在上面这个语法描述中,0001行的commands是任何SHELL命令。ID是一个字符串标识,标志着嵌入文档的开始(习惯上,经常使用的标识是EOF,等等)。从0002行能够写任何文本,这里写入的内容都将做为标准输入传送给commands。在最后一行写标识符ID,代码嵌入文本结束。
  • 例子:
     1  #!/bin/sh 
     2 
     3  echo "ID~"`grep title  reg_prop.xml  | cut -d\" -f2 | ./toline.sh` 
     4  for v in 0*[0-9A-F].REG; do
     5    echo -n "$v~"
     6 
     7    while true; do
     8      read line
     9 
    10      if [ "$?" == "1" ]; then
    11        break
    12      fi
    13 
    14      echo -n $line"~"
    15    done  <
    16    `cut -d: -f2 $v`
    17  EOF
    18 
    19    echo
    20  done

因为SHELL脚本起源于上个世纪70、80年代,所以可读性比当前的编程语言通常要差一些,所以下面对这个脚本中的内容做一下简单的说明:编程

        1. 第4行-20行的for循环是对650个文件依次进行处理。(对于分隔符,原本是想用分号,或者逗号,或者空格。结果这些字符在注册信息里全出现了,后来选了“~”号)。编程语言

        2. 第7-15行是while循环,执行的基本功能是把每一个信息文件拼成一行。xml

        3. 16行是执行cut命令,提取文件中冒号右边的内容,把输出做为Here Documents送给while循环。文档

        4. 在while循环中,第8行是使用read命令,每次读取一行,使用“~”拼成一行。注意这里有个特殊的处理:由于在信息文件中某一项注册项多是空的,这样16行的输出可能中间有空行。所以,判断read的结束不能使用if [ "$line" == ""] 的方法。通过调查,发现能够从read的返回值获取是否到达行末的状态。若是是遇到Ctrl-D结束,那么返回值是1。若是是正常的回车键结束,即便没有任何内容,返回值也是0。所以,正确的判断是 if [ "$?" == "1" ];字符串

        5. 17行的EOF是表明Here Documents的结束。注意此处不能像写C程序同样,为了美观而把EOF向右缩进,由于SHELL规定EOF必须是该行惟一出现的内容,连空格都不能有。所以,这个EOF就暂时突出在这一行了。(经过将输入操做符改成“<<-”能够解决这个问题,可是这里也无伤大雅)。it

        6. 文件中的toline.sh是自已编写的另一个经常使用脚本,用于把输入的若干文本行拼成一行,而且以“~”分隔。这个脚本的实现比较简单,建议留给读者本身练习编写。for循环

相关文章
相关标签/搜索