gpt4 book ai didi

linux - 扩展 bash 变量,但不扩展它包含的变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:34 25 4
gpt4 key购买 nike

我需要能够将变量扩展为它声明字符串的确切内容,而不是像通常那样在其声明中扩展其他变量。

variable=word
var="this variable contains a $variable"

echo ????

我需要一个结果为:“this variable contains a $variable”的命令...而不是:“此变​​量包含一个词

变量声明必须保持不变,因为它需要在所有其他情况下正常扩展。所以我不能在声明中使用单引号。

最佳答案

您所要求的实际上是不可能的,因为在双引号内,$variable在定义时 的变量内容替换。
在您打印它时,扩展早就发生了(使用 set 可以看到)。

如果您根本无法更改定义,您唯一可以尝试的就是恢复替换:

echo ${var/"$variable"/'$variable'}

这将替换字符串文字 $variable 当前包含的 $variable 的所有出现,因此在您的示例中它将替换所有出现的 word$variable,无论它是否以这种方式定义。
此外,正如 Jasper 正确指出的那样,这依赖于 $variable$var 的定义和打印之间没有改变这一事实。

现在,如果您确实可以更改定义,但只希望扩展仍然发生,则有多种选择:

  1. 在定义中使用单引号,打印时使用eval

    var='this variable contains a $variable'
    # later
    eval "echo "'"'"$var"'"' # -> this variable contains a word
    echo $var # -> this variable contains a $variable

    不可否认,这很麻烦。
    另请注意,变量扩展发生在打印时而不是定义时(实际上,发生在 eval 运行的任何时间)。

  2. 使用两个不同的变量。

    不必每次都编写 eval "echo "'"'"$var"'"',您可以将其结果存储在一个变量中并使用它,对吗?

    var='this variable contains a $variable'
    varX="$(eval "echo "'"'"$var"'"')"
    # later
    echo $varX # -> this variable contains a word
    echo $var # -> this variable contains a $variable

    或者,当然只是复制 $var 的定义并将 ' 替换为 "...但这很无聊。:P

    此处扩展发生在定义 $varX 时。

  3. 使用一个数组而不是两个不同的变量。

    这真的很有趣,因为对于数组 $var 等于 ${var[0]},所以你可以这样做

    tmp='this variable contains a $variable'
    var=("$(eval "echo "'"'"$tmp"'"')" "$tmp")
    # later
    echo $var # -> this variable contains a word
    echo ${var[1]} # -> this variable contains a $variable

    这可能与您想要的最接近,但您仍然需要更改定义。

关于linux - 扩展 bash 变量,但不扩展它包含的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com