BASH:在echo期间替换变量内的变量

时间:2012-06-12 13:13:11

标签: bash

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

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.

这可能吗?

5 个答案:

答案 0 :(得分:5)

你需要一个能够优雅地完成工作的功能。

say() {
    echo "Installing $INS"
}

INS=hello
say

INS=world
say

或者只是这个:

say() {
    echo "Installing $@"
}

say hello

say world

答案 1 :(得分: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

答案 2 :(得分:1)

参数替换也可以这样做:

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

结果:

'aaa xxx aaa'

答案 3 :(得分:0)

INS='Installing $VAR'
result=`eval "echo $INS"`
echo $result

你必须使用单引号来代替$ VAR来创建INS eval在运行时评估$ INS,并使用echobackticks将其作为替换字符串返回

答案 4 :(得分:-2)

正如Hachi所说,你需要单引号来防止$ VAR过早评估。格雷厄姆在评论中建议避免像这样的子shell调用:

#!/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