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