【问题标题】:Updating variables by reference in bash script?在bash脚本中通过引用更新变量?
【发布时间】:2021-03-19 14:42:22
【问题描述】:

是否可以在 bash 脚本in the way it is done in C++ 中通过引用来使用变量?

假设我有一个如下脚本:

#!/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?

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

我从Lazy Evaluation in Bash 中了解到envsubst。是按照方法来做的吗?

A="say"
B=$A
echo "B is $B"
envsubst A="say it"
echo "B is $B"

【问题讨论】:

标签: bash envsubst


【解决方案1】:

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

与 C++ 类似,一旦为变量赋值 ,就无法跟踪值的来源。在 shell 中,所有变量都存储字符串。您可以将变量名称作为字符串存储在另一个变量中,该变量充当引用。您可以使用:

Bash 间接扩展:

A="say"
B=A
echo "B is ${!B}"
A="say it"
echo "B is ${!B}"

Bash 名称引用:

A="say"
declare -n B=A
echo "B is $B"
A="say it"
echo "B is $B"

邪恶eval:

A="say"
B=A
eval "echo \"B is \$$B\""
A="say it"
eval "echo \"B is \$$B\""

这可能吗?

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

来自 Bash 中的惰性评估的 envsubst。是按照方法来做的吗?

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

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2020-08-14
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2021-02-24
    • 2019-07-20
    相关资源
    最近更新 更多