在变量名中使用 '.' 的 Bash 脚本属性文件



我是新手的bash脚本,并且有一个关于在bash脚本中使用.properties文件的属性的问题。

我已经看到了使用'。例如,在变量名称之间:

this.prop.one=someProperty

,我已经看到它们从脚本中的呼叫:

echo ${this.prop.one}

但是当我尝试设置此属性时,我会收到一个错误:

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

我可以使用属性,如果没有'。在变量名称中,并包括道具文件:

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

我真的希望能够使用'。在变量名称中,如果可能的话,不必包括。脚本中的test.properties

这是可能的吗?

更新:

感谢您的回答!好吧,这很奇怪。我正在使用看起来像这样的bash脚本(用于玻璃鱼的服务):

#!/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(即使在symlink 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 '%sn' "$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

否可以做。BASH手册说了有关变量名称的说明:

名称

一个单词仅由字母,数字和下划线组成,并以字母或下划线开始。名称用作外壳变量和函数名称。也称为标识符。

dot不允许。

dot不允许成为可变名称。因此,您不能仅仅简单地源自属性文件。

您能做的是:

"解析"文件,而不是源。例如。使用Perl,Awk或Grep获得有趣的属性名称的价值,并将其分配给您的shell var。

如果您确实想用名称以DOT设置VAR,则可以使用env 'a.b.c=xyz'并从env输出中获取a.b.c

相关内容

  • 没有找到相关文章

最新更新