通过 bash 脚本中的引用更新变量?

Gam*_*ads 1 bash envsubst

是否可以像在 C++ 中那样在bash 脚本通过引用来使用变量?

假设我有一个如下所示的脚本:

#!/bin/bash

A="say"
B=$A
echo "B is $B"
A="say it"
echo "B is $B" # This does not get the new value of A but is it possible to using some trick?
Run Code Online (Sandbox Code Playgroud)

即使 的值已从 更改为,您也会在上面的脚本echo "B is $B输出中看到。我知道重新分配喜欢会解决它。但我想知道是否有可能持有对的引用,以便在更新后立即更新它的值。这发生在没有重新分配的情况下。这可能吗?B is sayAsaysay itB=$ABABAB=$A

envsubstBash 中的 Lazy Evaluation 中读到了。是按照方法去做吗?

A="say"
B=$A
echo "B is $B"
envsubst A="say it"
echo "B is $B"
Run Code Online (Sandbox Code Playgroud)

Kam*_*Cuk 5

通过 bash 脚本中的引用更新变量?

而类似于C ++,一旦您指定的的变量,没有办法跟踪,其中从价值是从哪里来的。在 shell 中,所有变量都存储字符串。您可以将变量名称作为字符串存储在另一个变量中,作为引用。您可以使用:

Bash 间接扩展:

A="say"
B=A
echo "B is ${!B}"
A="say it"
echo "B is ${!B}"
Run Code Online (Sandbox Code Playgroud)

Bash 名称参考:

A="say"
declare -n B=A
echo "B is $B"
A="say it"
echo "B is $B"
Run Code Online (Sandbox Code Playgroud)

邪恶eval

A="say"
B=A
eval "echo \"B is \$$B\""
A="say it"
eval "echo \"B is \$$B\""
Run Code Online (Sandbox Code Playgroud)

这可能吗?

是 - 将变量的名称存储在 中B,而不是值中。

来自 Bash 中的 Lazy Evaluation 的 envsubst。是按照方法去做吗?

不,envsubst做一些不同的事情。