0

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

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

echo ????

我需要一个导致:“ this variable contains a $variable” ...而不是:“ this variable contains a word”的命令

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

4

2 回答 2

3

你可以使用单引号:

variable=word
var='this variable contains a $variable'
echo var
于 2015-01-23T17:16:22.173 回答
3

您所要求的实际上是不可能的,因为在双引号内,在定义时$variable被该变量的内容所取代。 在您打印它时,扩展早已发生(如使用 所示)。
set

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

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

这将替换$variable字符串字面值当前包含的所有内容$variable,因此在您的示例中,它将替换所有出现的wordwith $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
    

    这可能与您想要的一样接近,但您仍然必须更改定义。

于 2015-01-23T17:16:41.350 回答