将$ {}占位符解析为shell脚本中的绝对路径

时间:2018-07-01 08:08:03

标签: bash shell properties

我有一个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?

2 个答案:

答案 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变量