我有一个包含以下内容的配置文件:
配置scrm.sh
CDT_TRIGGER='69'
SR_TRIGGER='165'
在主脚本中,我需要将 CDT_TRIGGER 的内容(即 69)插入到名为 TRIGGER 的变量中。我唯一需要知道的是,我应该获取该确切变量内容的是另一个名为 ELM='CDT' 的(本地)变量
因此,在主脚本中,我执行:
主程序
#!/bin/bash
source config_scrm.sh
(some calculations to obtain the value of variable ELM)
ELM='CDT'
我需要 TRIGGER 为 69。
如果 ELM='SR',我需要 TRIGGER 为 165。等等,值远比此摘录中显示的要多。
不起作用的是:
MYSTRING='_TRIGGER'
TRIGGER=${$ELM$MYSTRING}
或者
TRIGGER=`echo "$ELM$MYSTRING"`
或者
TRIGGER=`$(echo "$ELM$MYSTRING")`
答案1
虽然$ELM$MYSTRING
扩展为您想要的名称,但是TRIGGER=${$ELM$MYSTRING}
不起作用,因为这里您需要参数扩展两次:首先是“内部”变量,然后是“外部”变量。
$
如果你真的使用“外部”来替换命令,那么你尝试替换命令就没有什么意义了尝试来触发额外的参数扩展;但即便如此,它们也会因与上述类似的原因而失败。
那么,你能参数扩展分为两个单独的步骤。eval
为此,您需要:
eval 'TRIGGER=$'"$ELM$MYSTRING"
首先,内的变量""
正常扩展,内的所有内容''
保持不变。然后eval
对结果字符串执行额外的解析,该字符串现在正好是TRIGGER=$CDT_TRIGGER
。该解决方案是可移植的,但您应该小心使用eval
。请参阅为什么eval
在 Bash 中应避免使用,以及我应该使用什么来代替?
在 Bash 中,有一种更安全(但不便携)的方式来做你想做的事情:
wholename=$ELM$MYSTRING # we need this in a single variable
TRIGGER=${!wholename}
附注:考虑变量名称使用小写字母。