Bash脚本属性文件使用“。” 以变量名

马特

我是bash脚本的新手,并且对在bash脚本中使用.properties文件中的属性有疑问。

我看过一个使用'。'的bash属性文件。变量名称之间,例如:

this.prop.one=someProperty

而且我已经看到它们是从脚本中调用的,例如:

echo ${this.prop.one}

但是,当我尝试设置此属性时,出现错误:

./test.sh: line 5: ${this.prop.one}: bad substitution

如果不使用“。”,则可以使用属性。在变量名称中,并包含props文件:

#!/bin/bash
. test.properties
echo ${this_prop_one}

我真的很想能够使用'。,如果可能的话,不必包含脚本中的test.properties

这可能吗?

更新:

感谢您的回答!好吧,那很奇怪。我正在使用一个如下所示的bash脚本(针对glassfish的服务):

#!/bin/bash

start() {
        sudo ${glassfish.home.dir}/bin/asadmin start-domain domain1
}

...

...并且有这样的属性文件(build.properties):

# glassfish
glassfish.version=2.1
glassfish.home.dir=${app.install.dir}/${glassfish.target}
...

那么,一定有某种方法可以做到这一点吗?如果在属性文件中声明了这些变量,它们是否按照定义不被视为“变量”?再次感谢。

查尔斯·达菲

将它们加载到关联数组中。这将要求您的外壳不是bash 4.x /bin/sh(即使是指向bash的符号链接也要以POSIX兼容模式运行)。

declare -A props
while read -r; do
  [[ $REPLY = *=* ]] || continue
  props[${REPLY%%=*}]=${REPLY#*=}
done <input-file.properties

...之后,您可以像这样访问它们:

echo "${props[this.prop.name]}"

如果您想递归地查找引用,那么它会变得更加有趣。

getProp__property_re='[$][{]([[:alnum:].]+)[}]'
getProp() {
  declare -A seen=( ) # to prevent endless recursion
  declare propName=$1
  declare value=${props[$propName]}
  while [[ $value =~ $getProp__property_re ]]; do
    nestedProp=${BASH_REMATCH[1]}
    if [[ ${seen[$nestedProp]} ]]; then
      echo "ERROR: Recursive definition encountered looking up $propName" >&2
      return 1
    fi
    value=${value//${BASH_REMATCH[0]}/${props[$nestedProp]}}
  done
  printf '%s\n' "$value"
}

如果我们props定义如下(您也可以通过在此答案顶部使用适当的来运行循环来获得此信息input-file.properties):

declare -A props=(
  [glassfish.home.dir]='${app.install.dir}/${glassfish.target}'
  [app.install.dir]=/install
  [glassfish.target]=target
)

...然后行为如下:

bash4-4.4$ getProp glassfish.home.dir
/install/target

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章