Подстановка переменных с восклицательным знаком в bash

46

У меня есть следующие строки в моем файле сценария bash .cfg

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

как ${!DDF_SOURCEоценивается? Это было бы !siebel_DATA_DATE_FORMAT, что не имеет смысла для меня.

фургон
источник

Ответы:

65

Это косвенное расширение , описанное в man bashразделе РАСШИРЕНИЕ , подраздел Расширение параметра :

Если первый символ параметра является восклицательным знаком (!), Вводится уровень косвенной косвенности. Bash использует значение переменной, сформированной из остальной части параметра, в качестве имени переменной; эта переменная затем раскрывается, и это значение используется в остальной части замещения, а не в значении самого параметра. Это известно как косвенное расширение.

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
manatwork
источник