Substitusi variabel dengan tanda seru di bash

46

Saya memiliki baris berikut dalam file skrip bash .cfg saya

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

bagaimana ${!DDF_SOURCE} dievaluasi? Itu akan menjadi !siebel_DATA_DATE_FORMAT, yang tidak masuk akal bagi saya.

mobil van
sumber

Jawaban:

65

Itu adalah ekspansi tidak langsung , yang didokumentasikan dalam man bashbagian EKSPANSI , sub ekspansi Parameter :

Jika karakter pertama dari parameter adalah tanda seru (!), Suatu tingkat tipuan variabel diperkenalkan. Bash menggunakan nilai variabel yang dibentuk dari sisa parameter sebagai nama variabel; variabel ini kemudian diperluas dan nilai itu digunakan di seluruh substitusi, bukan nilai parameter itu sendiri. Ini dikenal sebagai ekspansi tidak langsung.

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
sumber