我需要能够将变量扩展为它的声明字符串,而不是像通常那样在其声明中扩展其他变量。
variable=word
var="this variable contains a $variable"
echo ????
我需要一个导致:“ this variable contains a $variable
” ...而不是:“ this variable contains a word
”的命令
变量声明必须保持不变,因为它需要在所有其他情况下正常展开。所以我不能在声明中使用单引号。
我需要能够将变量扩展为它的声明字符串,而不是像通常那样在其声明中扩展其他变量。
variable=word
var="this variable contains a $variable"
echo ????
我需要一个导致:“ this variable contains a $variable
” ...而不是:“ this variable contains a word
”的命令
变量声明必须保持不变,因为它需要在所有其他情况下正常展开。所以我不能在声明中使用单引号。
你可以使用单引号:
variable=word
var='this variable contains a $variable'
echo var
您所要求的实际上是不可能的,因为在双引号内,在定义时$variable
被该变量的内容所取代。
在您打印它时,扩展早已发生(如使用 所示)。set
如果您根本无法更改定义,那么您唯一可以尝试的就是恢复替换:
echo ${var/"$variable"/'$variable'}
这将替换$variable
字符串字面值当前包含的所有内容$variable
,因此在您的示例中,它将替换所有出现的word
with $variable
,无论它是否以这种方式定义。
此外,正如 Jasper 正确指出的那样,这依赖$variable
于$var
.
现在,如果您确实可以更改定义,但只希望扩展仍然发生,则有多种选择:
eval
在定义中和打印时使用单引号。
var='this variable contains a $variable'
# later
eval "echo "'"'"$var"'"' # -> this variable contains a word
echo $var # -> this variable contains a $variable
诚然,这相当麻烦。
另请注意,变量扩展发生在打印时而不是在定义时(实际上,只是在任何时间eval
运行)。
使用两个不同的变量。
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
。
使用数组而不是两个不同的变量。
这真的很有趣,因为对于数组$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
这可能与您想要的一样接近,但您仍然必须更改定义。