您的位置:首页 > 运维架构 > Shell

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

2013-02-27 15:20 716 查看
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,返回其他值为失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: