我在评论中解释了我的问题:
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.
这可能吗?
答案 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,并使用echo
和backticks
将其作为替换字符串返回
答案 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