使用语法${var}
和$(var)
调用变量有什么不同吗?例如,变量将被扩展的方式还是什么?
答案 0 :(得分:64)
没有区别 - 它们的意思完全相同(在GNU Make和POSIX中)。
我认为$(round brackets)
看起来更整洁,但这只是个人偏好。
(其他答案指向GNU Make文档的相关部分,请注意,您不应该在单个表达式中混合语法)
答案 1 :(得分:34)
GNU make
文档状态中的Basics of Variable References section 无差异:
要替换变量的值,请写一个美元符号后跟 括号或大括号中变量的名称:
$(foo)
或${foo}
是变量foo的有效参考。
答案 2 :(得分:12)
正如已经正确指出的那样,没有区别但要警惕不要混合使用这两种分隔符,因为它可能会导致像 unomadh GNU make这样的神秘错误示例
来自the GNU make manual on the Function Call Syntax(强调我的):
[...]如果参数本身包含其他函数调用或变量引用,则最明智的做法是对所有引用使用相同类型的分隔符;写
$(subst a,b,$(x))
,而不是$(subst a,b,${x})
。这是因为它更清晰,而且因为只匹配一种类型的分隔符来查找引用的结尾。
答案 3 :(得分:11)
实际上,它似乎有很大不同:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
输出
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
但到目前为止,当$ {...}中的变量名称包含逗号时,我才发现这种差异。我首先想到$ {...}正在扩展逗号而不是作为值的一部分,但事实证明我不能以这种方式破解它。我仍然不明白这一点......如果有人有解释,我很高兴知道!
答案 4 :(得分:7)
$ {}样式允许您测试shell中的make规则,如果您设置了相应的环境变量,因为它与bash兼容。
答案 5 :(得分:2)
如果表达式包含不平衡的括号,则会有所不同:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
对于变量引用,这对函数或包含方括号的变量名有所不同(不好的主意)