我想得到如下效果,但我不知道如何:
$> 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
一般来说,变量的值仅在分配给它时才会改变。如果您想要每次访问时都重新计算的内容,检索命令的输出。
如果您想要动态更改其他程序使用的变量的值,例如PATH
和LD_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)