我在这里使用 tcsh,并尝试获取动态引用另一个环境变量的环境变量......
我希望能够执行以下操作,并且我确信我之前已经在其他地方见过它:
$ setenv A abc
$ setenv B a_is_${A}
$ echo $B
> a_is_abc
$ setenv A def
$ echo $B
> a_is_def
但是,当最初设置 $B 时,它会立即评估 $A,而不是等到实际需要时再评估。这意味着我两次执行“echo $B”都会得到相同的结果。
知道如何做到这一点吗?
谢谢
答案1
我认为您不能在 shell 中执行此操作。当设置 B 时,B 将始终采用 A 的值,而不是在读取 B 时。
我所见过的唯一地方是你所描述的是在 Makefiles 中,它会在那里保留表达式并在读取时对其进行评估。
答案2
我想我已经弄清楚了……
$ setenv A abc
$ setenv B 'a_is_${A}'
$ echo $B
> a_is_$A
$ eval echo $B
> a_is_abc
$ setenv A def
$ eval echo $B
> a_is_def
首先,这一切都是关于使用“eval”的组合以及在变量周围加上引号......
就我而言,我是这么使用的:
set sw_version '${SW_VERSION_MAJOR}.${SW_VERSION_MINOR}'
set sw_plugin_path /path/to/plugins/for/sw/${sw_version}/plugins
if ( $?SW_PATH ) then
setenv SW_PATH ${sw_plugin_path}:$SW_PATH
else
setenv SW_PATH ${sw_plugin_path}
endif
然后,在软件的包装脚本中,我只需要:
eval setenv SW_PATH $SW_PATH
这意味着我可以随时更改 SW_VERSION_MAJOR 或 SW_VERSION_MINOR,并且 SW_PATH 也会相应更改,而无需从头开始重置。