在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,Python、php等语言都有丰富的类库。
 shell脚本在日常Linux使用过程中经常用到,但是缺少一些”类库“,本文将通过Linux下的sed等命令,实现一套shell config parser,支持ini类型的配置文件,这种文件由多个section组成,每个section下面有有多个配置项,要求同一配置文件中section不可重复,如下的配置文件中的[db_3306]和[db_3308]就是该配置文件中的section,配置项的value如果有多个值,使用空格隔开。


        [db_3306]
        db_host=127.0.0.1
        db_user=root
        db_port=3306
        db_passowrd=root123

        [db_3308]
        db_host=192.168.1.1
        db_user=admin
        db_port=3308
        db_passowrd=admin123

接下来将介绍如何通过sed等命令实现解析、删除、修改、新增配置文件中的section和配置项。

  • 列出某个配置文件中的所有section

        function GetSec()
        {
            conf=$(echo $1)
            g_sec=`sed -n '/\[*\]/p' $conf  |grep -v '^#'|tr -d []`
            echo  "$g_sec"
        }

  • 列出某个section中的所有的Key


    function Keylist()
    {
        l_sec=$(echo $1)
        l_conf=$(echo $2)
        sed -n '/\['$l_sec'\]/,/\[/p' $l_conf|grep -Ev '\[|\]|^$'|awk -F'=' '{print $1}'
    }
    



    该函数需要两个参数,分别是section和所要解析配置文件.

  • section中删除某个Key


    function DelKey()
    {
        d_sec=$(echo $1)
        d_key=$(echo $2)
        d_conf=$(echo $3)
        sed -i '/\['$d_sec']/{:a;N;/\n\[/!{$!ba};s/\('$d_key'\)[^\n]*//1}' $d_conf
        sed -i '/^$/d' $d_conf
        sed -i '/\[*\]/{x;p;x;}' $d_conf
    }
    



    该函数需要三个参数,分别是section和该section中对应的Key及要进行操作的配置文件。

  • section中增加某个Key


    function SetKey()
    {
    
        s_sec=$(echo $1)
        s_key=$(echo $2)
        s_value=$(echo $3)
        s_conf=$(echo $4)
        key_value="$s_key=$s_value"
        if Keylist $s_sec $s_conf|grep "$s_key" >/dev/null
        then
            echo "$s_key already exists,please update $s_key"
        else
            sed -i "/^\[$s_sec\]/a$key_value" $s_conf
        fi
    }
    



该函数需要指定四个参数,分别是要进行的操作的section和配置文件,新增的Key及Value,当Key存在时,不允许新增。

  • section中修改某个Key

    function ModKey()
    {
        m_sec=$(echo $1)
        m_key=$(echo $2)
        m_dis=$(echo $3) 
        m_conf=$(echo $4) 
        sed -i '/\['$m_sec']/{:a;N;/\n\[/!{$!ba};s/\('$m_key'\)[^\n]*/\1='$m_dis'/1}' $m_conf
    }
    



该函数需要指定4个参数,分别是要进行操作的section和配置文件,需要修改的Key,及修改后的Value。

上面五个函数中的参数含义统一解释如下:
sec代表的是对应的section,_key代表的是配置文件中section段落中等号左边的值,_conf代表的是配置文件,_value代表的是section段落中等号右边的值,_value代表的是section段落中等号右边的值.