Sustitución variable con un signo de exclamación en bash

46

Tengo las siguientes líneas en mi archivo de script bash .cfg

DDF_SOURCE="siebel_DATA_DATE_FORMAT"
DATA_DATE_FORMAT=${!DDF_SOURCE}

¿Cómo se ${!DDF_SOURCEevalúa}? Sería !siebel_DATA_DATE_FORMAT, lo que no tiene sentido para mí.

camioneta
fuente

Respuestas:

65

Esa es una expansión indirecta , documentada en la man bashsección EXPANSIÓN , subsección Expansión de parámetros :

Si el primer carácter del parámetro es un signo de exclamación (!), Se introduce un nivel de indirección variable. Bash usa el valor de la variable formada a partir del resto del parámetro como el nombre de la variable; esta variable se expande y ese valor se usa en el resto de la sustitución, en lugar del valor del parámetro en sí. Esto se conoce como expansión indirecta.

bash-4.2$ DDF_SOURCE="siebel_DATA_DATE_FORMAT"

bash-4.2$ siebel_DATA_DATE_FORMAT='Hello Indirect Redirection'

bash-4.2$ DATA_DATE_FORMAT=${!DDF_SOURCE} # siebel_DATA_DATE_FORMAT must get value before this line

bash-4.2$ echo $DATA_DATE_FORMAT
Hello Indirect Redirection
hombre trabajando
fuente