Soy nuevo en bash scripting y tengo una pregunta sobre el uso de propiedades de un archivo .properties dentro de un script bash.
He visto un archivo de propiedades de bash que usa '.' entre nombres de variables, por ejemplo:
this.prop.one=somePropertyy los he visto llamados desde dentro de un script como:
echo ${this.prop.one}Pero cuando trato de establecer esta propiedad, aparece un error:
./test.sh: line 5: ${this.prop.one}: bad substitutionPuedo usar propiedades si lo hago sin '.' en los nombres de las variables e incluya el archivo props:
#!/bin/bash . test.properties echo ${this_prop_one}Realmente me gustaría poder usar '.' en los nombres de las variables y, si es posible, no tiene que incluir . test.properties en el script.
es posible?
ACTUALIZAR:
¡Gracias por tus respuestas! Bueno, entonces esto es extraño. Estoy trabajando con un script bash que se ve así (un servicio para glassfish):
#!/bin/bash start() { sudo ${glassfish.home.dir}/bin/asadmin start-domain domain1 } ...... y hay archivos de propiedades como este (build.properties):
# glassfish glassfish.version=2.1 glassfish.home.dir=${app.install.dir}/${glassfish.target} ...Entonces, debe haber alguna forma de hacer esto, ¿verdad? ¿Es posible que no se consideren 'variables' por definición si se declaran en un archivo de propiedades? Gracias de nuevo.
Cárguelos en una matriz asociativa. Esto requerirá que su shell sea bash 4.x, no /bin/sh (que, incluso cuando es un enlace simbólico a bash, se ejecuta en modo de compatibilidad con POSIX).
declare -A props while read -r; do [[ $REPLY = *=* ]] || continue props[${REPLY%%=*}]=${REPLY#*=} done <input-file.properties...después de lo cual puede acceder a ellos así:
echo "${props[this.prop.name]}"Si desea buscar referencias recursivamente, entonces se vuelve un poco más interesante.
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" } Si tenemos props definidos de la siguiente manera (que también podría obtener ejecutando el bucle en la parte superior de esta respuesta con un archivo de input-file.properties apropiado):
declare -A props=( [glassfish.home.dir]='${app.install.dir}/${glassfish.target}' [app.install.dir]=/install [glassfish.target]=target )... entonces el comportamiento es el siguiente:
bash4-4.4$ getProp glassfish.home.dir /install/targetNo se puede hacer. El manual de bash dice esto sobre los nombres de las variables:
nombre
Una palabra que consta únicamente de letras, números y guiones bajos, y que comienza con una letra o un guión bajo. Los nombres se utilizan como variables de shell y nombres de funciones. También conocido como identificador.
Puntos no permitidos.
no se permite que el punto sea un nombre de variable. por lo que no puede simplemente obtener el archivo de propiedades.
Lo que puedes hacer es:
"analizar" el archivo, no buscarlo. Por ejemplo, con perl, awk o grep para obtener el valor del nombre de propiedad interesante y asignarlo a su shell var.
si desea establecer una var con un punto en su nombre, puede usar env 'abc=xyz' y obtener el abc de la salida env .