Variable Ersetzung mit einem Ausrufezeichen in Bash


46

Ich habe die folgenden Zeilen in meiner .cfg-Bash-Skriptdatei

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

Wie wird ${!DDF_SOURCE} bewertet? Es wäre !siebel_DATA_DATE_FORMAT, was für mich keinen Sinn ergibt.

Antworten:


65

Dies ist eine indirekte Erweiterung , dokumentiert in man bashAbschnitt EXPANSION , Unterabschnitt Parametererweiterung :

Wenn das erste Zeichen des Parameters ein Ausrufezeichen (!) Ist, wird eine Stufe der variablen Indirektion eingeführt. Bash verwendet den Wert der aus dem Rest des Parameters gebildeten Variablen als Namen der Variablen. Diese Variable wird dann erweitert und dieser Wert wird im Rest der Ersetzung verwendet und nicht der Wert des Parameters selbst. Dies wird als indirekte Expansion bezeichnet.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.