华域联盟 linux shell Shell脚本读取ini配置文件的实现代码2例

Shell脚本读取ini配置文件的实现代码2例

一、简单版

参考stackoverflow的例子,改了一个出来:

复制代码 代码如下:

while IFS='= ' read var val

do

    if [[ $var == \[*] ]]
    then

        section=$(echo $var | sed 's/^\[\(.*\)\]$/\1/')

    elif [[ $val ]]
    then

        if [ -z $section ];then

            declare "${var}=$val"

        else

            declare "${section}.${var}=$val"

        fi 

    fi 

done < config.ini

使用的时候:

复制代码 代码如下:

${section.key}

就可以读到变量啦。

二、复杂版

复制代码 代码如下:

[comon]
ids=com1,com2,com3

files=profilefile

 

 

[com1]
key="name"

file="test"

 

[com2]
key="name1"

file="test"

 

[com3]
key="name2"

file="test"

取[com1]的key值我查了下,还好在ChinaUnix里面查到了命令(貌似一位叫wintty兄写的):

复制代码 代码如下: awk -F '=' '/\[com1\]/{a=1}a==1&&$1~/key/{print $2;exit}' config.ini

这样就简单取到值了。

查了下命令终于明白,命令分为两个部分:

先模式匹配到:[com1]然后执行动作:a=1,再接着有来个模式+命令

模式:“a==1&&$1~/key/”

a==1因为已经赋值了,所以执行下一步,如果$1第一个字段匹配key的值,则

打印第2项,紧接着退出,退出就不会打印到匹配[com2]和[com3]的key值.

 

需求会变得,现在变成取【com】几个key对应的值,提供的shell的脚本如下:


复制代码 代码如下:

#!/bin/sh

getconfig()

{

  SECTION=$1

  CONFILE=$2

  ENDPRINT="key\tfile\t"

  echo "$ENDPRINT"

  for loop in `echo $ENDPRINT|tr '\t' ' '`

  do

       #这里面的的SECTION的变量需要先用双引号,再用单引号,我想可以这样理解,

       #单引号标示是awk里面的常量,因为$为正则表达式的特殊字符,双引号,标示取变量的值

       #{gsub(/[[:blank:]]*/,"",$2)去除值两边的空格内容

       awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE

  done

}

 

#更改变量名称

CONFIGFILE=$1

echo "========================================================"

#文件名称

echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"

#取得ids中的每个id把,号分隔改成空格,因为循环内容要以空格分隔开来

profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`

#对于一个配置文件中的所有id循环

for OneCom in $profile

do

  echo "--------------------------------------------------"

  echo "COM:$OneCom"

  #此处函数调用有时候不能用反引号,不然会出错,此处原由还不清楚知道的麻烦请告之

  getconfig  $OneCom  $CONFIGFILE

  echo "\n"

  echo "--------------------------------------------------"

  #break

done

echo "========================================================"

 

执行的结果如下:


复制代码 代码如下: $ one.sh File

========================================================

+++ConfigName:File+++++++++++++++++++++++++++++++

--------------------------------------------------

COM:com1

key     file  

name    file1 

--------------------------------------------------

--------------------------------------------------

COM:com2

key     file  

name1   file2 

--------------------------------------------------

--------------------------------------------------

COM:com3

key     file  

name2   file3 

--------------------------------------------------

 

嘿嘿需求又变了,配置文件有多个,怎么取多个文件的配置项嘛:


复制代码 代码如下: #!/bin/sh

getconfig()

{

  SECTION=$1

  CONFILE=$2

  ENDPRINT="key\tfile\t"

 

  echo "$ENDPRINT"

  for loop in `echo $ENDPRINT|tr '\t' ' '`

  do

  

       awk -F '=' '/\['"$SECTION"'\]/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%s\t",$2) ;exit}' $CONFILE

  done

}

 

#显示的多个文件名将多行的回车符转成逗号分隔符

CONFIGFILES=`ls $1|tr '\n' ','`

#查看到底有多个配置文件

_Num=`echo $CONFIGFILES|tr -cd \,|wc -c`

#临时变量保存配置多个文件

_TMPFILES=$CONFIGFILES

while [ $_Num -ge 1 ]
do

  #得到一个文件

  CONFIGFILE=`echo $_TMPFILES|cut -d ',' -f1`

  #余下的文件

  _TMPFILES=`echo $_TMPFILES|cut -d ',' -f2-`

  #配置文件数量减一

  _Num=$(($_Num-1))

  echo "========================================================"

  #文件名称

  echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"

  profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`

  #对于一个配置文件中的所有id循环

  for OneCom in $profile

  do

    echo "--------------------------------------------------"      

    echo "COM:$OneCom"

    getconfig  $OneCom  $CONFIGFILE

    echo "\n"

    echo "--------------------------------------------------"

    #break

  done

echo "========================================================"

done

 

两个小时终于写好了,请各位转载的时候不要忘记加上我的地址哦,也不枉费我辛苦一场。

您可能感兴趣的文章:

本文由 华域联盟 原创撰写:华域联盟 » Shell脚本读取ini配置文件的实现代码2例

转载请保留出处和原文链接:https://www.cnhackhy.com/16047.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部