【问题标题】:Need to read the values of a config file from a shell script需要从 shell 脚本中读取配置文件的值
【发布时间】:2014-06-24 07:00:53
【问题描述】:

我有一个 shell 脚本和一个通用配置文件,其中存储了所有通用路径、用户名和其他值。我想在运行 sh 脚本时从此配置文件中获取值。

示例:

sample.conf
pt_user_name=>xxxx
pt_passwd=>Junly@2014
jrnl_source_folder=>x/y/v
pt_source_folder=>/x/y/r/g
css_source_folder=>/home/d/g/h

现在我想在我的 sh 脚本中得到类似的东西。

cd $css_source_folder

shell 脚本中的这个命令应该在脚本运行时将我带到位置 d/g/h。

除了 grep 和 awk 之外还有什么方法可以实现吗??

谢谢 里努

【问题讨论】:

  • 你能用cutpaste吗?

标签: shell configuration-files


【解决方案1】:

如果您想每次都从 conf 文件中读取,那么 grep 和 cut 可能会对您有所帮助,

假设您需要 css_source_folder 属性的值 prop1="css_source_folder" (我假设您知道您想要其值的属性名称)

value_of_prop1=`grep $prop1 sample.conf| cut -f2 -d "=" | cut -f2 -d ">"`

喜欢,

[db2inst2@pegdb2 ~]$ vi con.conf
[db2inst2@pegdb2 ~]$ grep css_source_folder con.conf
css_source_folder=>/home/d/g/h
[db2inst2@pegdb2 ~]$ value=`grep css_source_folder con.conf | cut -f2 -d "="`
[db2inst2@pegdb2 ~]$ echo $value
>/home/d/g/h
[db2inst2@pegdb2 ~]$ value=`grep css_source_folder con.conf | cut -f2 -d "=" | cut -f2 -d ">"`
[db2inst2@pegdb2 ~]$ echo $value
/home/d/g/h

如果您想一次读取所有属性,然后应用循环,这将解决目的

【讨论】:

    【解决方案2】:

    是的,可以比较简单的获取配置名和值,通过数组索引进行关联。读取您的配置可以这样完成:

    #!/bin/bash
    
    test -r "$1" || { echo "error: unable to read conf file [$1]\n"; exit 1; }
    
    declare -a tag
    declare -a data
    let index=0
    
    while read line || test -n "$line"; do
    
        tag[index]="${line%%\=*}"
        data[index]="${line##*\>}"
        ((index++))
    
    done < "$1"
    
    for ((i=0; i<${#tag[@]}; i++)); do
    
        printf " %18s   %s\n" "${tag[$i]}" "${data[$i]}"
    
    done
    

    读取配置文件后,配置名称标签和配置值分别存储在数组tagvalue 中:

           pt_user_name   xxxx
              pt_passwd   Junly@2014
     jrnl_source_folder   x/y/v
       pt_source_folder   /x/y/r/g
      css_source_folder   /home/d/g/h
    

    此时,您将决定如何使用它们,无论是作为密码还是作为目录。你可能需要写几个函数,但是给定一个标签的基本函数,得到正确的数据可以这样完成:

    function getvalue {
    
        test -n "$1" || { echo "error in getvalue, no data supplied"; return 1; }
    
        for ((i=0; i<${#tag[@]}; i++)); do
    
            if test "$1" = "${tag[$i]}"; then
                echo " eval cmd ${data[$i]}"
                return $i
            fi
    
        done
    
        return -1
    }
    
    echo -e "\nget value for 'jrnl_source_folder'\n"
    
    getvalue "jrnl_source_folder"
    

    该函数将返回数据值的索引并且可以执行任何需要的命令。您似乎有目录路径和密码,因此您可能需要每个功能。为了说明,示例的输出为:

    get value for jrnl_source_folder
    
    eval cmd x/y/v
    

    您还可以在 BASH 的更高版本中使用关联数组将标记和数据存储在单个关联数组中。您还可以在标签和数据值上使用indirect references 来处理它们。我只是在示例中采用了直截了当的方法。

    【讨论】:

      【解决方案3】:

      试试这个eval $(awk -F'=&gt;' '{print $1"=\""$2"\";"}' sample.conf):

      前:

      eval $(awk -F'=>' '{print $1"=\""$2"\";"}' sample.conf); echo $pt_user_name
      xxxx
      

      使用sed

      eval $(sed -re 's/=>/="/g' -e  's/$/";/g' sample.conf); echo $pt_passwd 
      Junly@2014
      

      使用perl

      eval $(perl -F'=>' -alne 'print "$F[0]=\"$F[1]\";"' sample.conf); echo $pt_source_folder
      /x/y/r/g
      

      使用tr

      eval $(tr -d '>' <sample.conf); echo "$css_source_folder"
      /home/d/g/h
      

      PS。根据 sample.conf 的内容,盲目地使用 tr 删除 &gt; 可能会导致不良结果,但对于提供的内容,它可以正常工作。

      【讨论】:

      • 少打字,我喜欢这个答案。
      • 感谢蒂亚戈。但我需要它没有 awk
      猜你喜欢
      • 2011-08-24
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多