2

我在评论中解释了我的问题:

VAR=
INS="Installing $VAR"

echo $INS   
.           # In each echo command I want to dynamically substitute
.           # the $VAR variable in the $INS variable. I want to do
echo $INS   # the substitution of the variable on echo command.

这可能吗?

4

5 回答 5

5

你需要一个函数来优雅地完成工作。

say() {
    echo "Installing $INS"
}

INS=hello
say

INS=world
say

或者只是这样:

say() {
    echo "Installing $@"
}

say hello

say world
于 2012-06-12T13:25:22.027 回答
3

例如:

[ghoti@pc ~]$ cat varins
#!/bin/bash

msg='Installing "$VAR"'

for VAR in foo bar baz; do
  eval echo "$msg"
done

[ghoti@pc ~]$ ./varins
Installing foo
Installing bar
Installing baz
[ghoti@pc ~]$ 

这取决于 $VAR 不会在单引号内展开的事实。该eval命令将展开$msg变量,shell 将在其中找到$VAR要替换的变量。

于 2012-06-12T13:37:04.313 回答
1

参数替换也可以:

ins='aaa $var aaa'
var='xxx'
echo "'${ins//\$var/$var}'"

结果:

'aaa xxx aaa'
于 2012-06-12T13:40:48.657 回答
0
INS='Installing $VAR'
result=`eval "echo $INS"`
echo $result

您必须使用单引号在创建 INS 时不替换 $VAR
eval在运行时和 with 评估 $INS 并echo作为backticks替换字符串返回

于 2012-06-12T13:20:50.087 回答
-2

正如 Hachi 所说,您需要单引号来防止 $VAR 过早评估。Graham 在评论中建议避免像这样的 subshel​​l 调用:

#!/bin/bash
VAR=17
INS='Installing $VAR'
eval "echo \"$INS\""
VAR=42
eval "echo \"$INS\""

如果你不这样做:

VAR=23
INS="Installing $VAR"
echo $(eval "echo $INS")
VAR=8
echo $(eval "echo $INS")

23 立即绑定,并且没有注意到分配 VAR=8 。

结果:

Installing 17
Installing 42
Installing 23
Installing 23
于 2012-06-12T13:34:08.030 回答