我正在尝试从包含句点(.)字符的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中的某个位置
7条答案
按热度按时间vcudknz31#
我在bash脚本中使用简单的**
grep
内部函数从.properties
文件接收属性。这个属性文件我用在两个地方-设置开发环境和作为应用程序参数。
我认为
grep
**在大循环中可能运行缓慢,但在我准备dev
环境时,它满足了我的需求。希望有人会觉得这个有用。
示例:
文件:设置.sh
文件:环境文件/dev.properties
用法:
j2cgzkjk2#
由于(Bourne)shell变量不能包含点,你可以用下划线替换它们。读每一行,把关键字中的.翻译成_并求值。
注意上面的代码只翻译了. to _,如果你有一个更复杂的格式,你可能需要使用额外的翻译。我最近不得不解析一个完整的Ant属性文件,里面有很多讨厌的字符,我不得不用途:
fhity93d3#
由于BASH shell中的变量名不能包含点或空格,因此最好在BASH中使用如下关联数组:
测试:
使用declare -p显示结果:
azpvetkf4#
对于性能极高且与BASH 3.0兼容的解决方案:
文件:加载属性.sh
这里提供的其他解决方案都很棒,也很优雅,但是
我需要一些东西在bash 3上工作,处理~ 1 k条目的属性文件,阅读~200个属性,整个脚本调用了很多次。
此函数还处理
测试
文件:我的.properties
测试脚本
输出
性能测试
包含4个NNNN.properties文件,其中包含以下条目
结果是
llew8vvj5#
@fork 2次
我已经这样试过了。请审查并更新我是否是正确的方法或没有。
gwbalxhn6#
我发现使用
while IFS='=' read -r
有点慢(我不知道为什么,也许有人可以在评论中简要解释一下,或者指出一个SO答案?)我还发现@Nicolai答案作为一个一行程序非常简洁,但效率非常低,因为它将一遍又一遍地扫描整个属性文件,以查找prop
的每一个调用。我找到了一个解决方案,它回答了这个问题,性能良好,而且是一行代码(虽然有点冗长)。
该解决方案可以进行寻源,但在寻源之前会对内容进行处理:
说明:
grep -v '^ *#'
:丢弃注解行grep '[^ ] *='
:丢弃不包含=
split($0,a,"=")
的行:在=
处拆分行并存入数组a
,即a[1]为键,a[2]为值gensub(/\./, "_", "g", a[1])
:将.
替换为_
print gensub... "=" a[2]}
将上面gensub
的结果与=
和值连接。编辑:正如其他人所指出的,有一些不兼容的问题(awk),而且它也没有验证内容,看看属性文件的每一行是否实际上是一个kv对。但这里的目标是展示一个快速和干净的解决方案的总体思路。来源似乎是要走的路,因为它加载属性一次,可以多次使用。
2j4z5cfb7#
我认为尼古拉的回答是好的。然而,有时候人们写道
代替
在这种情况下。如果我们直接使用
它将生成“127.0.0.70“而不是“127.0.0.70”,字符串组合中存在一些错误。要解决此问题,我们可以添加“|xargs”。它将是
我们会得到我们想要的。