与变量相关的变量

与变量相关的变量

我想得到如下效果,但我不知道如何:

$> A='/dir'
$> B="$A/bin"
$> echo $B
/dir/bin
$> A='/other'
$> echo $B
/other/bin

有任何想法吗?

答案1

Ksh93 有一种受限形式,其中一个变量可以是对另一个变量的间接引用:

$ A=/dir
$ typeset -n B=A
$ echo $B
/dir
$ A=/other
$ echo $B
/other

常见的 shell 都没有发生两次扩展的变量。 Bash 具有类似于 ksh 中的间接引用功能,但语法不同:您需要在访问时而不是在定义时指定您想要间接引用。

$ A=/dir
$ B=A
$ echo ${!B}
/dir
$ A=/other
$ echo ${!B}
/other

一般来说,变量的值仅在分配给它时才会改变。如果您想要每次访问时都重新计算的内容,检索命令的输出

如果您想要动态更改其他程序使用的变量的值,例如PATHLD_LIBRARY_PATH,那么无论 shell 有什么高级功能,这是不可能的。程序启动后,其环境变量就是启动时收到的变量;更改 shell 中的值不会影响已在运行的进程中的值。

如果您想根据某些事件更改这些变量的值,可以通过运行 shell 代码来实现。例如,您可以让 bash 运行一些代码每次显示提示时或者当当前目录改变时。同样,这不会影响已经运行的程序。

答案2

如果你想要类似模板变量的东西,你可以eval扩展......

A=/dir
B=\$A/bin
eval echo $B

A=/other
eval echo $B

答案3

变量的行为并非如此。你想要的是一个功能:

B () {
    echo "$A/bin"
}

A=/dir
echo $(B)

A=/other
echo $(B)

相关内容