当前位置:  操作系统/服务器>linux

Shell脚本读取ini配置文件的实现代码2例

    来源: 互联网  发布时间:2014-10-17

    本文导语:  一、简单版 参考stackoverflow的例子,改了一个出来: 代码如下: while IFS='= ' read var val do     if [[ $var == [*] ]]     then         section=$(echo $var | sed 's/^[(.*)]$/1/')     elif [[ $val ]]     then         if [ -z $section ];then  ...

一、简单版

参考stackoverflow的例子,改了一个出来:

代码如下:

while IFS='= ' read var val
do
    if [[ $var == [*] ]]
    then
        section=$(echo $var | sed 's/^[(.*)]$/1/')
    elif [[ $val ]]
    then
        if [ -z $section ];then
            declare "${var}=$val"
        else
            declare "${section}.${var}=$val"
        fi 
    fi 
done < config.ini

使用的时候:

代码如下:

${section.key}

就可以读到变量啦。

二、复杂版

代码如下:

[comon]
ids=com1,com2,com3
files=profilefile
 
 
[com1]
key="name"
file="test"
 
[com2]
key="name1"
file="test"
 
[com3]
key="name2"
file="test"

取[com1]的key值我查了下,还好在ChinaUnix里面查到了命令(貌似一位叫wintty兄写的):

代码如下:
awk -F '=' '/[com1]/{a=1}a==1&&$1~/key/{print $2;exit}' config.ini

这样就简单取到值了。
查了下命令终于明白,命令分为两个部分:
先模式匹配到:[com1]然后执行动作:a=1,再接着有来个模式+命令
模式:“a==1&&$1~/key/”
a==1因为已经赋值了,所以执行下一步,如果$1第一个字段匹配key的值,则
打印第2项,紧接着退出,退出就不会打印到匹配[com2]和[com3]的key值.
 
需求会变得,现在变成取【com】几个key对应的值,提供的shell的脚本如下:
代码如下:

#!/bin/sh
getconfig()
{
  SECTION=$1
  CONFILE=$2
  ENDPRINT="keytfilet"
  echo "$ENDPRINT"
  for loop in `echo $ENDPRINT|tr 't' ' '`
  do
       #这里面的的SECTION的变量需要先用双引号,再用单引号,我想可以这样理解,
       #单引号标示是awk里面的常量,因为$为正则表达式的特殊字符,双引号,标示取变量的值
       #{gsub(/[[:blank:]]*/,"",$2)去除值两边的空格内容
       awk -F '=' '/['"$SECTION"']/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%st",$2) ;exit}' $CONFILE
  done
}
 
#更改变量名称
CONFIGFILE=$1
echo "========================================================"
#文件名称
echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
#取得ids中的每个id把,号分隔改成空格,因为循环内容要以空格分隔开来
profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
#对于一个配置文件中的所有id循环
for OneCom in $profile
do
  echo "--------------------------------------------------"
  echo "COM:$OneCom"
  #此处函数调用有时候不能用反引号,不然会出错,此处原由还不清楚知道的麻烦请告之
  getconfig  $OneCom  $CONFIGFILE
  echo "n"
  echo "--------------------------------------------------"
  #break
done
echo "========================================================"

 
执行的结果如下:
代码如下:
$ one.sh File
========================================================
+++ConfigName:File+++++++++++++++++++++++++++++++
--------------------------------------------------
COM:com1
key     file  
name    file1 
--------------------------------------------------
--------------------------------------------------
COM:com2
key     file  
name1   file2 
--------------------------------------------------
--------------------------------------------------
COM:com3
key     file  
name2   file3 
--------------------------------------------------

 
嘿嘿需求又变了,配置文件有多个,怎么取多个文件的配置项嘛:
代码如下:
#!/bin/sh
getconfig()
{
  SECTION=$1
  CONFILE=$2
  ENDPRINT="keytfilet"
 
  echo "$ENDPRINT"
  for loop in `echo $ENDPRINT|tr 't' ' '`
  do
  
       awk -F '=' '/['"$SECTION"']/{a=1}a==1&&$1~/'"$loop"'/{gsub(/[[:blank:]]*/,"",$2);printf("%st",$2) ;exit}' $CONFILE
  done
}
 
#显示的多个文件名将多行的回车符转成逗号分隔符
CONFIGFILES=`ls $1|tr 'n' ','`
#查看到底有多个配置文件
_Num=`echo $CONFIGFILES|tr -cd ,|wc -c`
#临时变量保存配置多个文件
_TMPFILES=$CONFIGFILES
while [ $_Num -ge 1 ]
do
  #得到一个文件
  CONFIGFILE=`echo $_TMPFILES|cut -d ',' -f1`
  #余下的文件
  _TMPFILES=`echo $_TMPFILES|cut -d ',' -f2-`
  #配置文件数量减一
  _Num=$(($_Num-1))
  echo "========================================================"
  #文件名称
  echo "+++ConfigName:$CONFIGFILE+++++++++++++++++++++++++++++++"
  profile=`sed -n '/ids/'p $CONFIGFILE | awk -F= '{print $2}' | sed 's/,/ /g'`
  #对于一个配置文件中的所有id循环
  for OneCom in $profile
  do
    echo "--------------------------------------------------"      
    echo "COM:$OneCom"
    getconfig  $OneCom  $CONFIGFILE
    echo "n"
    echo "--------------------------------------------------"
    #break
  done
echo "========================================================"
done

 
两个小时终于写好了,请各位转载的时候不要忘记加上我的地址哦,也不枉费我辛苦一场。

    
 
 

您可能感兴趣的文章:

  • shell脚本如何调用另外一个shell脚本的函数?
  • 急救!关于Shell脚本删除过期文件的问题,Shell脚本达人乱入
  • shell 脚本中命令别名在脚本外无法使用
  • 傻瓜问题,请问shell编程和shell脚本编程的关系
  • C语言调用shell脚本后,通过何种方法能获取脚本中变量的值
  • 想用shell脚本定时执行另一个脚本
  • 一个shell执行另一个带参数shell脚本????????????
  • 如何给shell脚本加密,脚本中有密码。最好是比较直接的,不要说让用 shc
  • Shell脚本调用Sql脚本并向其中传递变量
  • 请问,Shell中如何执行另外一个Shell脚本?
  • 如何传递参数给linux shell 脚本(当脚本从标准输入而不是从文件获取时)
  • nohup执行的shell脚本,全局变量不能传递到脚本中使用吗?
  • cd、zip等命令在shell提示符下能执行,在shell脚本中为什么不能执行呢?
  • shell脚本问题 关于父脚本和子脚本的问题
  • shell脚本错误输出
  • 请教shell脚本启动程序
  • 关于shell脚本的。
  • 关于arm linux下的别名配置脚本如何在进入用户时让shell执行的问题,如bashrc,profile,.bash_profile等脚本,寻求高手解答
  • 高分请教关于Shell脚本执行中断问题?
  • linux shell脚本
  • shell读取文件的简单问题
  • 如何在C中既能读取到shell的执行结果,又能在必要时kill掉shell的进程
  • C shell中如何读取文件内容
  • shell脚本读取rrd文件将数据插入sqlserver数据库中
  • 我想在shell中读取时间 2004-JAN-15 用date +%b 读出为Jan 谢谢在线等
  • 怎样在shell中调用ping,traceroute命令,并对读取文件中的地址进行操作?
  • 求助:shell脚本读取文件内容
  • 怎样用shell读取properties里面特定键对应的值?
  • shell读取文件,并对内容进行操作
  • 使用shell读取XML文件信息
  • Linux 如何 用 Shell 读取 CSV 数据文件
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • shell 的配置文件如何修改?
  • 关于Secure Shell和Exceed的配置问题
  • Ubuntu中如何配置shell(bash)的环境
  • 哪里有关于linux环境变量配置及shell编程的资料下载.
  • 有没有linux系统基本命令和系统配置还有shell编程入门的书?
  • Oracle 下导入txt的shell脚本以及配置 iis7站长之家
  • 如何在linux shell 下启动/停止samba共享服务,如何手动配置?
  • 请问RH9 的shell 下配置自带防火墙的方法,启动/关闭方法
  • 程序中如何使用setenv或者export配置环境变量在当前shell生效
  • 怎样配置shell??
  • Oracle 下导入txt的shell脚本以及配置
  • 用samba实现windows 与 linux 文件共享,我没有在shell下操作,图形界面下怎么配置
  • 一键配置CentOS iptables防火墙的Shell脚本分享
  • Centos6下安装Shell下文件上传下载rz,sz命令
  • 不同类型的shell*(K SHELL , C SHELL) 用命令怎么切换?
  • linux bash shell命令:grep文本搜索工具简介
  • 我在执行shell时,想在shell里直接向mysql数据库插入数据,我该如何写shell。
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 菜鸟问问题:shell是什么呢?普通的ls、cp、pwd这些命令算不算shell呢?如何把自己写的文件变成shell呢?
  • linux bash shell命令:文本搜索工具grep中用于egrep和 grep -E的元字符扩展集
  • shell变量和子shell的问题请教
  • linux bash shell命令:文本搜索工具Grep命令选项及实例
  • 请问“当前shell”和“子shell”的区别?
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • 怎么知道当前是B_SHELL 还是C_SHELL
  • 用户登陆后运行某SHELL退出SHELL就回到LOGIN是怎么作到的?
  • 怎么写shell代码 写好shell怎么运行?
  • 请问一个shell中如何获取这个shell自身抛出的错误?
  • 非登录shell是什么 意思,和登录shell有什么区别啊
  • Solaris 8中修改root的shell为一个非法的Shell后怎么办?
  • 各位Shell高人,如何取得Shell的第10个入口参数?$10不行啊,急!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3