嵌入文檔——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循環

相關文章
相關標籤/搜索