我有以下Bash函数,它从Java风格的属性文件返回属性值。找不到它的属性,它应该返回非零值。如果找到,将打印属性的值&返回码必须为零。
function property_get() {
local pfile="$1"
local pname="$2"
if egrep "^${pname}=" "$pfile" 2>&1 >/dev/null; then
local line="$(egrep "^${pname}=" "$pfile")"
printf "${line#*=}"
return 0 # success
else
return 1 # property not found
fi
}
问题是:如何避免两次调用egrep?第一个exec用于状态代码,第二个用于属性值。如果我使用$(grep parameters)
表示法,那么grep将在子shell中启动,我无法获得它的返回代码,并且无法确定属性搜索的成功或失败。
答案 0 :(得分:2)
这应该有效:
...
local line
if line=$(egrep "^${pname}=" "$pfile" 2>/dev/null); then
...
答案 1 :(得分:0)
正如@matt指出的那样,你可以获取该行,然后检查命令的退出状态:
line=$(...)
if test $? -eq 0; then
# success
...
else
# property not found
...
fi
修改强>
总结:
var=$(cmd)
将var
设置为cmd
的标准输出,将$?
设置为退出状态cmd
local var=$(cmd)
,$?
将设置为local
的退出状态0
,如下所述:Why does "local" sweep the return code of a command?