Shell实现读取ini格式配置文件方法(无坑版)

最近在写个小项目需要同时用到shell、python,所以选择了.ini文件做为通用配置文件,python操作配置文件就太简单了,但shell就很尴尬。

以下内容是从网上找到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
readIni() {
    file=$1;section=$2;item=$3;
    val=$(awk -F '=' '/\['${section}'\]/{a=1} (a==1 && "'${item}'"==$1){a=0;print $2}' ${file}) 
    echo ${val}
}
 
writeIni() {
    file=$1;section=$2;item=$3;val=$4
    awk -F '=' '/\['${section}'\]/{a=1} (a==1 && "'${item}'"==$1){gsub($2,"\"'${val}'\"");a=0} {print $0}' ${file} 1<>${file}
}
 
readIniSections() {
    file=$1;
    val=$(awk '/\[/{printf("%s ",$1)}' ${file} | sed 's/\[//g' | sed 's/\]//g')
    echo ${val}
}

单个测试使用非常正常,但是,我要说但是,写入文件的方法是巨坑!!!!!!!!!!!

因为awk调用命令有管道的产生或者有打开文件的操作,要在执行结束后用close进行相应的关闭,不然频繁的调用会导致文件写入混乱。

(无坑完善版)

1
2
3
4
5
6
7
writeIni() {
    file=$1;section=$2;item=$3;val=$4
	test -f "$1" && test ! -z "$2" && test ! -z "$3" && test ! -z "$4"
	if [ $? -eq 0 ]; then
		awk -F '=' '/\['${section}'\]/{a=1} (a==1 && "'${item}'"==$1){gsub($2,"\"'${val}'\"");a=0} {print $0} {close("'${file}'")}' ${file} 1<>${file}
	fi
}