cfg_find(){ file_name=$1 labelname=$2 key=$3 labelline=$(grep -n "^\[.*\]$" $file_name | awk -F ':' '{print $1}') lineinfo=$(grep -n "^\[.*\]$" $file_name | awk -v labelname="$labelname" -F ':' '{a[NR]=$1;b[NR]=$2} END{for(i=0;i<length(b);i++){if(b[i-1]==labelname){print a[i-1],a[i]}}}') lable_lines=() total_line=$(cat $file_name | wc -l) for line in $lineinfo do start_line=$(echo $line | awk '{print $1}') end_line=$(echo $line | awk '{print $2}') if [ -z $end_line ] then $end_line=$total_line fi if [ ! -z $start_line ] || [ ! -z $end_line ] then keyinfo=$(cat $file_name | head -n $(($end_line-1)) | tail -n "+"$start_line | grep -n $key | tail -n 1 | sed 's/ //g') sub_line=$(cat $keyinfo | grep -n "^"$key"=" | awk -F ':' '{print $1}') if [ ! -z sub_line ] then $lable_lines[${#lable_lines[@]}]=$(($start_line+$sub_line-1)) fi fi done return $lable_lines } cfg_get(){ file_name=$1 labelname=$2 key=$3 cfg_find $file_name $labelname $key lable_lines=$? if [ ${#lable_lines[@]} -eq 0 ] then return '' else: ln=$lable_lines[${#lable_lines[@]}] key_value=$(cat $file_name | sed -n $ln"p") value=$(echo $key_value | awk -F '=' '{print $2}') return $value fi } cfg_modify(){ file_name=$1 labelname=$2 key=$3 new_value=$4 cfg_find $file_name $labelname $key lable_lines=$? if [ ${#lable_lines[@]} -eq 0 ] then return 0 else: ln=$lable_lines[${#lable_lines[@]}] key_value=$(cat $file_name | sed -n $ln"p") key=$(echo $key_value | awk -F '=' '{print $1}') new_key_value=$key"="$new_value sed '"$ln"c "$new_key_value"' $file_name sed -n '"$ln"p' $file_name return 1 fi }