我有一个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
答案 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
读完配置文件后,您将分别存储在数组tag
和value
中的配置名称标签和配置值:
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的内容,但提供的工作正常。