bash中带有感叹号的变量替换

van*_*van 62 bash variable-substitution

我的 .cfg bash 脚本文件中有以下几行

DDF_SOURCE="siebel_DATA_DATE_FORMAT"
DATA_DATE_FORMAT=${!DDF_SOURCE}
Run Code Online (Sandbox Code Playgroud)

${!DDF_SOURCE}如何评估?它会是!siebel_DATA_DATE_FORMAT,这对我来说没有意义。

man*_*ork 93

这是一个间接扩展,记录在man bash部分EXPANSION,小节Parameter Expansion 中

如果参数的第一个字符是感叹号 (!),则引入了一个变量间接级别。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
Run Code Online (Sandbox Code Playgroud)