shell腳本讀取ini配置文件的值


本博客引用自:https://blog.csdn.net/yuzaipiaofei/article/details/6619472

  1  
  2 2011-07-19 16:22
  3  
  4 昨天熬了夜,純屬打醬油,順便幫同事看了下查看INI文件內容,不敢獨享,拿出來分享下。
  5  
  6 現有需求用SHELL命令讀取INI文件里面的具體的Key值那?加入有INI文件config.ini格式一般如下:
  7  
  8 [comon]
  9 ids=com1,com2,com3
 10 files=profilefile
 11  
 12  
 13 [com1]
 14 key="name"
 15 file="test"
 16  
 17 [com2]
 18 key="name1"
 19 file="test"
 20  
 21 [com3]
 22 key="name2"
 23 file="test"
 24  
 25 取[com1]的key值我查了下,還好在ChinaUnix里面查到了命令(貌似一位叫wintty兄寫的):
 26  awk -F '=' '/\[com1\]/{a=1}a==1&&$1~/key/{print $2;exit}' config.ini
 27 這樣就簡單取到值了。
 28 查了下命令終於明白,命令分為兩個部分:
 29 先模式匹配到:[com1]然后執行動作:a=1,再接着有來個模式+命令
 30 模式:“a==1&&$1~/key/ 31 a==1因為已經賦值了,所以執行下一步,如果$1第一個字段匹配key的值,則
 32 打印第2項,緊接着退出,退出就不會打印到匹配[com2]和[com3]的key值.
 33  
 34 -------------------------------------------------------------
 35 需求會變得,現在變成取【com】幾個key對應的值,提供的shell的腳本如下:
 36 #!/bin/sh
 37 getconfig()
 38 {
 39   SECTION=$1
 40   CONFILE=$2
 41   ENDPRINT="key\tfile\t"
 42   echo "$ENDPRINT"
 43   for loop in `echo $ENDPRINT|tr '\t' ' '`
 44   do
 45        #這里面的的SECTION的變量需要先用雙引號,再用單引號,我想可以這樣理解,
 46        #單引號標示是awk里面的常量,因為$為正則表達式的特殊字符,雙引號,標示取變量的值
 47        #{gsub(/[[:blank:]]*/,"",$2)去除值兩邊的空格內容
 48        awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE
 49   done
 50 }
 51  
 52 #更改變量名稱
 53 CONFIGFILE=$1
 54 echo "========================================================"
 55 #文件名稱
 56 echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
 57 #取得ids中的每個id把,號分隔改成空格,因為循環內容要以空格分隔開來
 58 profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
 59 #對於一個配置文件中的所有id循環
 60 for OneCom in $profile
 61 do
 62   echo "--------------------------------------------------"
 63   echo "COM:$OneCom"
 64   #此處函數調用有時候不能用反引號,不然會出錯,此處原由還不清楚知道的麻煩請告之
 65   getconfig  $OneCom  $CONFIGFILE
 66   echo "\n"
 67   echo "--------------------------------------------------"
 68   #break
 69 done
 70 echo "========================================================"
 71  
 72  
 73 執行的結果如下:
 74 $ one.sh File
 75 ========================================================
 76 +++ConfigName:File+++++++++++++++++++++++++++++++
 77 --------------------------------------------------
 78 COM:com1
 79 key     file   
 80 name    file1  
 81 --------------------------------------------------
 82 --------------------------------------------------
 83 COM:com2
 84 key     file   
 85 name1   file2  
 86 --------------------------------------------------
 87 --------------------------------------------------
 88 COM:com3
 89 key     file   
 90 name2   file3  
 91 --------------------------------------------------
 92 ========================================================
 93  
 94 嘿嘿需求又變了,配置文件有多個,怎么取多個文件的配置項嘛:
 95 #!/bin/sh
 96 getconfig()
 97 {
 98   SECTION=$1
 99   CONFILE=$2
100   ENDPRINT="key\tfile\t"
101  
102   echo "$ENDPRINT"
103   for loop in `echo $ENDPRINT|tr '\t' ' '`
104   do
105    
106        awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE
107   done
108 }
109  
110 #顯示的多個文件名將多行的回車符轉成逗號分隔符
111 CONFIGFILES=`ls $1|tr '\n' ','`
112 #查看到底有多個配置文件
113 _Num=`echo $CONFIGFILES|tr -cd \,|wc -c`
114 #臨時變量保存配置多個文件
115 _TMPFILES=$CONFIGFILES
116 while [ $_Num -ge 1 ]
117 do
118   #得到一個文件
119   CONFIGFILE=`echo $_TMPFILES|cut -d ',' -f1`
120   #余下的文件
121   _TMPFILES=`echo $_TMPFILES|cut -d ',' -f2-`
122   #配置文件數量減一
123   _Num=$(($_Num-1))
124   echo "========================================================"
125   #文件名稱
126   echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
127   profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
128   #對於一個配置文件中的所有id循環
129   for OneCom in $profile
130   do
131     echo "--------------------------------------------------"       
132     echo "COM:$OneCom"
133     getconfig  $OneCom  $CONFIGFILE
134     echo "\n"
135     echo "--------------------------------------------------"
136     #break
137   done
138 echo "========================================================"
139 done
140  
141  
142 兩個小時終於寫好了,請各位轉載的時候不要忘記加上我的地址哦,也不枉費我辛苦一場。
143 http://www.cublog.cn/u1/55091/showart_2125956.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM