做个shell解析ini文件,用作搭建HA框架中的解析ini配置文件
测试的ini文件是系统里面搜到的一个
Example driver definitions
Driver from the postgresql-odbc package
Setup from the unixODBC package
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/psqlodbc.so
Setup = /usr/lib/libodbcpsqlS.so
Driver64 = /usr/lib64/psqlodbc.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
Driver from the mysql-connector-odbc package
Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc5.so
Setup = /usr/lib/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc5.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1
iniparser.sh脚本主要就两个函数一个检查ini文件是否合法,另一个是去读取值的
该脚本主要为其它脚本提供这两个函数,处理是不会放在该脚本内的,最后四行是简单测试用的
#!/bin/bash
#传入参数 文件名
#返回值 0,合法;其他值非法或出错
function check_syntax()
{
if [ ! -f $1 ];then
return 1
fi
ret=$(awk -F= 'BEGIN{valid=1}
{
#已经找到非法行,则一直略过处理
if(valid == 0) next
#忽略空行
if(length($0) == 0) next
#消除所有的空格
gsub(" |\t","",$0)
#检测是否是注释行
head_char=substr($0,1,1)
if (head_char != "#"){
#不是字段=值 形式的检测是否是块名
if( NF == 1){
b=substr($0,1,1)
len=length($0)
e=substr($0,len,1)
if (b != "[" || e != "]"){
valid=0
}
}else if( NF == 2){
#检测字段=值 的字段开头是否是[
b=substr($0,1,1)
if (b == "["){
valid=0
}
}else{
#存在多个=号分割的都非法
valid=0
}
}
}
END{print valid}' $1)
if [ $ret -eq 1 ];then
return 0
else
return 2
fi
}
#参数1 文件名
#参数2 块名
#参数3 字段名
#返回0,表示正确,且能输出字符串表示找到对应字段的值
#否则其他情况都表示未找到对应的字段或者是出错
function get_field_value()
{
if [ ! -f $1 ] || [ $# -ne 3 ];then
return 1
fi
blockname=$2
fieldname=$3
begin_block=0
end_block=0
cat $1 | while read line
do
if [ "X$line" = "X[$blockname]" ];then
begin_block=1
continue
fi
if [ $begin_block -eq 1 ];then
end_block=$(echo $line | awk 'BEGIN{ret=0} /^\[.*\]$/{ret=1} END{print ret}')
if [ $end_block -eq 1 ];then
#echo "end block"
break
fi
need_ignore=$(echo $line | awk 'BEGIN{ret=0} /^#/{ret=1} /^$/{ret=1} END{print ret}')
if [ $need_ignore -eq 1 ];then
#echo "ignored line:" $line
continue
fi
field=$(echo $line | awk -F= '{gsub(" |\t","",$1); print $1}')
value=$(echo $line | awk -F= '{gsub(" |\t","",$2); print $2}')
#echo "'$field':'$value'"
if [ "X$fieldname" = "X$field" ];then
#echo "result value:'$result'"
echo $value
break
fi
fi
done
return 0
}
check_syntax odbcinst.ini
echo "check syntax status:
?
"
G
L
O
B
A
L
F
I
E
L
D
V
A
L
U
E
=
?" GLOBAL_FIELD_VALUE=
?"GLOBALFIELDVALUE=(get_field_value odbcinst.ini PostgreSQL Setup)
echo “status:
?
,
v
a
l
u
e
:
?,value:
?,value:GLOBAL_FIELD_VALUE”
————————————————
版权声明:本文为优快云博主「chlaws」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/chlaws/article/details/8799784