我正在尝试从包含句点(.)的shell脚本读取属性文件。字符如下:
# app.properties
db.uat.user=saple user
db.uat.passwd=secret
#/bin/sh
function pause(){
read -p "$*"
}
file="./app.properties"
if [ -f "$file" ]
then
echo "$file found."
. $file
echo "User Id " $db.uat.user
echo "user password =" $db.uat.passwd
else
echo "$file not found."
fi
我试图在源文件之后解析文件,但它不工作,因为关键字包含“。字符,并且该值中也有空格。
我的属性文件始终驻留在脚本的同一目录中或/usr/share/doc中的某个位置
发布于 2015-03-03 20:07:16
因为(Bourne) shell变量不能包含点,所以可以用下划线替换它们。每一行都读一遍,翻译一下。在关键字_和评估中。
#/bin/sh
file="./app.properties"
if [ -f "$file" ]
then
echo "$file found."
while IFS='=' read -r key value
do
key=$(echo $key | tr '.' '_')
eval ${key}=\${value}
done < "$file"
echo "User Id = " ${db_uat_user}
echo "user password = " ${db_uat_passwd}
else
echo "$file not found."
fi
请注意,以上内容仅用于翻译。对于_,如果你有一个更复杂的格式,你可能想要使用额外的翻译。我最近不得不解析一个包含许多讨厌字符的完整Ant属性文件,在那里我不得不使用:
key=$(echo $key | tr .-/ _ | tr -cd 'A-Za-z0-9_')
发布于 2015-03-04 22:15:57
@fork2x
我已经尝试过这样的.Please评论,并更新我,无论它是不是正确的方法。
#/bin/sh
function pause(){
read -p "$*"
}
file="./apptest.properties"
if [ -f "$file" ]
then
echo "$file found."
dbUser=`sed '/^\#/d' $file | grep 'db.uat.user' | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'`
dbPass=`sed '/^\#/d' $file | grep 'db.uat.passwd' | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'`
echo database user = $dbUser
echo database pass = $dbPass
else
echo "$file not found."
fi
发布于 2017-04-07 02:35:26
我发现使用while IFS='=' read -r
有点慢(我不知道为什么,也许有人可以在评论中简短地解释一下,或者指向一个这样的答案?)我还发现@Nicolai answer作为一行程序非常简洁,但效率非常低,因为它会一遍又一遍地扫描整个属性文件,以获取prop
的每一个调用。
我找到了一个解决方案,它回答了这个问题,执行得很好,而且它是一行(虽然有点冗长)。
该解决方案进行寻源,但在寻源之前对内容进行了修改:
#!/usr/bin/env bash
source <(grep -v '^ *#' ./app.properties | grep '[^ ] *=' | awk '{split($0,a,"="); print gensub(/\./, "_", "g", a[1]) "=" a[2]}')
echo $db_uat_user
解释:
grep -v '^ *#'
:丢弃注释行grep '[^ ] *='
:丢弃没有=
的行split($0,a,"=")
:在=
处拆分行并存储到数组a
中,即a1是关键字,a2是值gensub(/\./, "_", "g", a[1])
:将.
替换为_
print gensub... "=" a[2]}
将上面gensub
的结果与=
和value连接起来。
编辑:正如其他人指出的,存在一些不兼容问题(awk),而且它不会验证内容以查看属性文件的每一行是否真的是kv对。但这里的目标是展示既快速又干净的解决方案的总体思路。采购似乎是可行的方法,因为它只需加载一次可多次使用的属性。
https://stackoverflow.com/questions/28830225
复制相似问题