Substituição variável com um ponto de exclamação no bash

39

Eu tenho as seguintes linhas no meu arquivo de script .cfg bash

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

como o ${!DDF_SOURCE } é avaliado? Seria !siebel_DATA_DATE_FORMAT , o que não faz sentido para mim.

    
por van 21.06.2012 / 18:10

1 resposta

58

Isso é uma expansão indireta , documentada em man bash seção EXPANSÃO , subseção Expansão do Parâmetro :

If the first character of parameter is an exclamation point (!), a level of variable indirection is introduced. Bash uses the value of the variable formed from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of parameter itself. This is known as indirect expansion.

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
    
por 21.06.2012 / 18:28