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

46

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

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

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

furgão
fonte

Respostas:

65

Essa é uma expansão indireta , documentada na man bashseção EXPANSÃO , subseção Expansão de parâmetro :

Se o primeiro caractere do parâmetro for um ponto de exclamação (!), Um nível de indireção variável é introduzido. Bash usa o valor da variável formada a partir do restante do parâmetro como o nome da variável; essa variável é expandida e esse valor é usado no restante da substituição, em vez do valor do próprio parâmetro. Isso é conhecido como expansão indireta.

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
homem a trabalhar
fonte