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

猜你喜欢

转载自www.cnblogs.com/hit-joseph/p/12330473.html