我有一个app.properties文件,如下所示
Base.dir="/user/test/application"
Result.dir="${base.dir}/result"
并且我已经创建了bash脚本来解析以上属性
function readConfigFile()
{
(grep -E "^${2}=" -m 1 "${1}" 2>/dev/null || echo "VAR=__UNDEFINED__") | head -n 1 | cut -d '=' -f 2-;
}
function setConfigFile()
{
sourceFile=${1}
}
function configGet()
{
if [ ! -z $sourceFile ]; then
val="$(readConfigFile $sourceFile "${1}")";
if [ "${val}" = "__UNDEFINED__" ]; then
echo "${1} value not exist"
# return empty string
printf -- "%s" "";
fi
printf -- "%s" "${val}";
else
echo "config file not exist"
# return empty string
printf -- "%s" "";
fi
}
我在解析器上方的调用方式类似于在下面
$Result_dir=$(configGet Result.dir)
但是,我不能真正将占位符$ {}转换为base_dir
我得到以下错误
ls $Result_dir
ls: cannot access ${Base_dir}/result: No such file or directory
有什么方法可以将$ {Base.dir}转换为/ user / test / application?
答案 0 :(得分:0)
我想您将无法以您希望的方式替代${base.dir}
(顺便说一下${Base.dir}
吗?),主要是因为据我所知, bash中不允许使用变量名。
您可以做的是使用bash的替换语法将${base.dir}
部分手动替换为相应的路径。例如:
setConfigFile 'app.properties'
Result_dir_raw=$(configGet Result.dir)
Result_dir=${Result_dir_raw/'${base.dir}'/$(configGet Base.dir)}
echo ${Result_dir}
我说“手动”是因为您仍然在源代码中指定要替换的模式是${base.dir}
,我猜这不是您想要的模式。
现在,如果运行此命令,您将看到${Result_dir}
变量的计算结果为""/user/test/application"/result"
,这显然不是路径,这是因为您将{{1}中的路径包围了}加上双引号,因此您要么需要在app.properties
函数中将其删除,要么将其完全丢失在配置文件中,这对我来说更有意义。
答案 1 :(得分:0)
为什么您要在变量名中使用.
,而在bash
中却不允许这样做:
$ Base.dir="/user/test/application"
-bash: Base.dir=/user/test/application: No such file or directory
$ Base_dir="/user/test/application"
$
那么,为什么会得到No such file or directory
?这是一个解释:
创建一个名为Base.dir=gash.sh
的文件,是的,这是合法的文件名
$ echo 'echo Hello World' > Base.dir=gash.sh
使文件可执行:
$ PATH=$PATH:.
$ chmod u+x Base.dir=gash.sh
现在键入命令:
$ Base.dir="gash.sh"
Hello World
使用下划线而不是点。顺便说一下,ksh
Korn shell不仅允许点,而且具有特殊含义,它是 compound变量。