Bash Script Properties File Using '.' in Variable Name

bash, linux, properties-file, scripting

Solution

Load them into an associative array. This will require your shell to be bash 4.x, not `/bin/sh` (which, even when a symlink to bash, runs in POSIX compatibility mode).

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

...after which you can access them like so:

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

If you want to recursively look up references, then it gets a bit more interesting.

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"
}

If we have `props` defined as follows (which you could also get by running the loop at the top of this answer with an appropriate `input-file.properties`):

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

...then behavior is as follows:

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

Problem

I'm new to bash scripting and have a question about using properties from a .properties file within a bash script. I have seen a bash properties file that uses'.' between variable names, for example: ``` this.prop.one=someProperty ``` and I've seen them called from within a script like: ``` echo ${this.prop.one} ``` But when I try to set this property I get an error: ``` ./test.sh: line 5: ${this.prop.one}: bad substitution ``` I can use properties if I do it without '.' in the variable names, and include the props file: ``` #!/bin/bash . test.properties echo ${this_prop_one} ``` I would really like to be able to use '.' in the variable names, and, if at all possible, not have to include . test.properties in the script. Is this possible? UPDATE: Thanks for your answers! Well, then this is strange. I'm working with a bash script that looks like this (a service for glassfish): ``` #!/bin/bash start() { sudo ${glassfish.home.dir}/bin/asadmin start-domain domain1 } ... ``` ...and there are property files like this (build.properties): ``` # glassfish glassfish.version=2.1 glassfish.home.dir=${app.install.dir}/${glassfish.target} ... ``` So, there must be some way of doing this right? Are these maybe not considered 'variables' by definition if they're declared in a properties file? Thanks again.

Original source

Related problems