需要从shell脚本中读取配置文件的值

时间:2014-06-24 07:00:53

标签: shell configuration-files

我有一个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之外,还有什么方法可以实现这个吗?

由于 Rinu

3 个答案:

答案 0 :(得分:2)

如果你想每次都从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

如果你想一次读取所有属性,那么应用循环,这将解决目的

答案 1 :(得分:0)

是的,您可以使配置名称和值相对简单,并通过数组索引关联它们。读取您的配置可以这样做:

#!/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来处理它们。我只是在示例中采用了直接的方法。

答案 2 :(得分:0)

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

EX:

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。盲目地使用tr删除>可能会导致不良结果,具体取决于sample.conf的内容,但提供的工作正常。