最近在写个小项目需要同时用到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 } |