linux – 使用’.’的Bash脚本属性文件在变量名称中

前端之家收集整理的这篇文章主要介绍了linux – 使用’.’的Bash脚本属性文件在变量名称中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

我见过一个使用’.’的bash属性文件.变量名之间,例如:

  1. this.prop.one=someProperty

我看到他们在一个脚本中调用,如:

  1. echo ${this.prop.one}

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

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

如果我没有’,’我可以使用属性.在变量名中,并包含props文件

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

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

这可能吗?

更新:

谢谢你的回答!那么,这很奇怪.我正在使用一个看起来像这样的bash脚本(glassfish服务):

  1. #!/bin/bash
  2. start() {
  3. sudo ${glassfish.home.dir}/bin/asadmin start-domain domain1
  4. }
  5. ...

…还有像这样的属性文件(build.properties):

  1. # glassfish
  2. glassfish.version=2.1
  3. glassfish.home.dir=${app.install.dir}/${glassfish.target}
  4. ...

那么,必须有一些方法来做到这一点吗?如果它们在属性文件中声明,这些可能不被视为“变量”吗?再次感谢.

最佳答案
将它们加载到关联数组中.这将要求你的shell是bash 4.x,而不是/ bin / sh(即使是bash的符号链接,也在POSIX兼容模式下运行).

  1. declare -A props
  2. while read -r; do
  3. [[ $REPLY = *=* ]] || continue
  4. props[${REPLY%%=*}]=${REPLY#*=}
  5. done

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

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

如果你想以递归的方式查找引用,那么它会变得更有趣.

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

如果我们有如下定义的道具(你也可以通过使用适当的input-file.properties在这个答案的顶部运行循环来获得):

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

……然后行为如下:

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

猜你在找的Linux相关文章