`
zhtch_123
  • 浏览: 80574 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

实用的shell脚本-------修改cfg文件

阅读更多
1.用于修改 cfg文件的shell脚本:
#!/usr/bin/ksh
function cfg_update_sec_key_value
{   
    typeset file_name="$1"
    typeset sec_name="$2"
    typeset key_name="$3"

    shift 3
    typeset key_value
    set -A key_value "$@"

    typeset -i sec_line_start
    typeset -i sec_line_end
    typeset key_line_buf

    ##查找段所在的起始行和结束行
    sec_line_start="`sed -n \"/^[ |${KEY_TAB}]*\[${sec_name}\]/=\" $file_name`"
    sec_line_start="`echo $sec_line_start`"
    ((sec_line_start+=1))
    sec_line_end="`sed -n \"$sec_line_start,/^[ |${KEY_TAB}]*\[.*\]/p\" $file_name | wc -l`"
    sec_line_end="`echo $sec_line_end`"
    ((sec_line_end=sec_line_start+sec_line_end-1))

    ##处理键名中的[和]
    typeset tmp_key_name="`echo $key_name | sed 's/\[/\\\[/g' | sed 's/\]/\\\]/g'`"
   
    typeset tmp_file="${smdb_user_home}/tmp.tmp"

    ##查找键所在行并修改键值
    typeset -i i=0
    typeset line_no=1
    typeset -i j=1   #指向当前行
    typeset -i k=2   #指向当前域
    typeset -i nf=0  #记录匹配行中以'#'符分隔的域数
    typeset note=""  #记录域信息
    typeset note_temp=""
    typeset line_max=`wc -l ${file_name}|awk '{print $1}'`    #记录文本的行数

    while [ "${j}" -le "${line_max}" ]
    do
        key_line_buf=`sed -n "${j}"p "${file_name}"`      #读取行
        if [ $line_no -ge $sec_line_start -a $line_no -le $sec_line_end ];then
            echo "$key_line_buf" | grep "^[ |${KEY_TAB}]*$tmp_key_name[ |${KEY_TAB}]*=.*$" 1>/dev/null 2>&1
            if [ $? -eq 0 ];then
                nf=`echo "$key_line_buf"|awk -F# '{print NF}' 2>/dev/null`
                if [ $nf -ge 2 ];then   #行中含有注释
                    while [ $k -le $nf ]
                    do
                        note=`echo "$key_line_buf"|awk -F# -v y=$k '{print $y}'`
                        note_temp="${note_temp}#${note}"
                        ((k+=1))
                    done
                        key_line_buf="$key_name=${key_value[i]}     $note_temp"
                        ((i+=1))
                else                     #行中无注释
                    key_line_buf="$key_name=${key_value[i]}"
                    ((i+=1))
                fi
            fi    #end匹配成功,进行处理
        fi       #end在指定段中查找指定的键名$tmp_key_name
        echo "$key_line_buf" >> $tmp_file   #输出行
        ((line_no+=1))
    ((j+=1))
    done

    cp $tmp_file $file_name
    rm -f $tmp_file

    return 0
}


2.调用cfg_update_sec_key_value函数的方法:
cfg_update_sec_key_value “file” “section” “key” “value”
修改成功返回0,返回其他值为失败。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics