Bash实现读写ini文件

读取ini文件

ini文件中可以存在以#和;作为注释的部分,不会影响读取的结果。函数如下

 1 #!/usr/bin/env bash
 2 #-------------------------------------------------------
 3 #    FileName    : Bash读取ini文件.sh
 4 #    Author        :hpy
 5 #    Date        :2020年11月08日
 6 #    Description    :读取ini文件的函数
 7 #------------------------------------------------------- 
 8 
 9 #-----------------------------------------
10 #函数名:ReadIni 
11 #功能:读取ini文件,读取成功返回状态码0,否则
12 #返回状态码1
13 #@param1:ini文件路径
14 #@param2:Section
15 #@param3:Option
16 #例如:ReadIni test.ini s2 Path 
17 #-----------------------------------------
18 function ReadIni(){
19     fid=$1
20     section=$2
21     option=$3
22 
23     test ! -f $fid && echo "不存在文件$fid" && return 2
24     if [ $# -eq 3 ] ; then
25         local src=$(cat $fid | awk '/\['$section'\]/{f=1;next} /\[*\]/{f=0} f' |  #找出section下的所有内容
26         grep $option | # 匹配option的行 
27         grep '='     | # 看看是不是存在=
28         cut -d'=' -f2| # 获取对应的值
29         cut -d'#' -f1| # 去除注释
30         cut -d';' -f1| #去除注释
31         awk '{gsub(/^\s+|\s+$/, "");print}') #去掉最前面的空格
32         echo $src
33         test ${#src} -eq 0 && return 2 || return 0  #读取到有效数据 返回状态码0
34     else
35         return 2
36     fi 
37 }
38 
39 
40 #示例
41 ReadIni test.ini s3 Path 
42 test $? -eq 0 && echo "成功读取到数据" || echo "读取失败"

 

增加或者改写ini文件

增加或者改写ini文件的内容

 1 #!/usr/bin/env bash
 2 #-------------------------------------------------------
 3 #    FileName    : WriteIni.sh
 4 #    Author        :hpy
 5 #    Date        :2020年11月08日
 6 #    Description    :写ini文件的函数
 7 #------------------------------------------------------- 
 8 
 9 #-----------------------------------------
10 #函数名:WriteIni
11 #功能:增加,改写ini文件,若不存在指定元素
12 #自动添加,存在则更改,操作成功返回状态码0,
13 #否则返回状态码2
14 #@param1:ini文件路径
15 #@param2:Section
16 #@param3:Option
17 #@param4:value
18 #例如:WriteIni test.ini s2 Path value
19 #-----------------------------------------
20 function WriteIni(){
21     fid=$1
22     section=$2
23     option=$3
24     value=$4
25     if [ ${fid#*.} != ini ] ; then  
26         echo "不是ini文件" 
27         return 2 
28     fi 
29     test ! -f $fid && echo "不存在文件$fid" && return 2
30     if [ $# -eq 4 ] ; then
31         local src=$(cat $fid | awk '/\['$section'\]/{f=1;next} /\[*\]/{f=0} f')  #先搜寻是否存在option
32         if [ ${#src} -eq 0 ] ;then #没有匹配到section,直接新建并添加内容
33             echo "[$section]" >> $fid
34             echo "    $option = $value"  >> $fid
35             return 0
36         else
37             local src=$(cat -n $fid | awk '/\['$section'\]/{f=1;next} /\[*\]/{f=0} f' | grep $option | grep '=')
38             if [  ${#src} -eq 0 ] ; then #没有对应的 option 直接添加
39                 local last=$(cat -n $fid | awk '/\['$section'\]/{f=1;next} /\[*\]/{f=0} f' | tail -n 1)
40                 last=$(echo $last | cut -d' ' -f1)
41                 sed -i "${last}a\    $option=$value" $fid 
42                 return 0
43             fi 
44             local old_value=$(echo $src | cut -d'=' -f2 |cut -d'#' -f1 | cut -d';' -f1  )
45             local idx=$(echo $src | cut -d' ' -f1)
46             local newcontext="$(cat $fid|sed -n "${idx}p" |  sed "s/$old_value/$value/" |  awk '{gsub(/^\s+|\s+$/, "");print}')"
47             sed -i "${idx}c\    $newcontext" $fid
48             return 0       
49         fi  
50     fi 
51 }
52 
53 
54 #示例
55 WriteIni test.ini s3 Go baby
56 test $? -eq 0 && echo "写入成功" || echo "写入失败"

 

测试的 test.ini 文件
 1 [s1] # yy
 2     Path  = /home/yhp/data.log  hh    ; baby # 
 3     Setup = s1.setup 
 4 [s2]
 5     Path  = hhhhhhhh/eeee
 6     Setup = s2.setup 
 7     Patx=mff
 8     Go=mff
 9 [s3]
10     Path =mff
11     Go=baby;这是一个保本 #走吧

 



posted @ 2021-01-01 22:17  dlover  阅读(941)  评论(0编辑  收藏  举报
levels of contents