【问题标题】:Expand a bash variable, but not the variables it contains展开 bash 变量,但不展开它包含的变量
【发布时间】:2015-03-22 19:17:57
【问题描述】:

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

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

echo ????

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

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

【问题讨论】:

  • 只使用单引号对你有用吗,或者你有一个脚本中的变量已经用双引号括起来了吗?
  • @RayToal 很遗憾,不,我无法更改变量声明。更新了问题以反映这一点。
  • 这是不可能的。当您执行 var="blah blah blah $variable", $variable` 时,在分配给 var 之前会展开。 (您可以很容易地看到这一点;更改variable 的值不会影响var。)。

标签: linux bash variables scripting variable-expansion


【解决方案1】:

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

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

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

这将用字符串文字$variable 替换当前所有出现的$variable,因此在您的示例中,它将用$variable 替换所有出现的word,无论它是以这种方式定义还是不是。
此外,正如 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
    

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

【讨论】:

  • 更新了问题以排除此解决方案,我无法更改变量声明
  • 我明白了,是的,我在这个问题中寻找的东西是不可能的。我将不得不按照之前的建议使用单引号制定另一个解决方案,但它与我提出的这个问题无关,所以我会接受这个答案。
  • @Jasper 是的,它依赖于变量没有改变的事实,但是问题怎么没有发生呢? $variable 内的双引号在定义时被替换,无论 $variable 之后是否更改。
  • 我的错,看来我没有仔细阅读这个问题。
【解决方案2】:

你可以使用单引号:

variable=word
var='this variable contains a $variable'
echo var

【讨论】:

  • 更新了问题以排除此解决方案,我无法更改变量声明
  • 如果您无法更改变量声明,请忘记这个问题。 $variable 在变量声明中被替换。 bash(1) 变量替换在 var="this variable contains a $variable" 中完成,因为它是双引号。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2021-01-20
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多