使用语法 ${var}和 $(var)调用变量有什么区别吗?例如,变量的展开方式或者其他什么?
${var}
$(var)
没有区别——它们的意思完全一样(在 GNUMake 和 POSIX Make 中)。
我认为 $(round brackets)看起来更整洁,但这只是个人喜好。
$(round brackets)
(其他答案指向 GNUMake 文档的相关部分,并且注意不应该在单个表达式中混合语法)
来自 GNU make文档状态的 < em > 变量引用基础 没有区别:
GNU make
若要替换变量的值,请写入一个美元符号,后跟 括号或大括号中变量的名称: < strong > $(foo)或 ${foo}是对变量 foo 的有效引用
$(foo)
${foo}
实际上,情况似乎完全不同:
, = , 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.
但到目前为止,我只是在 ${ ... }中的变量名包含逗号时才发现这种差异。我一开始以为 ${ ... }是在展开逗号,而不是作为值的一部分,但结果我不能这样做。我还是不明白... 如果有人能解释一下,我会很高兴知道的!
正如已经正确指出的那样,但是没有什么不同,但是要小心不要混合使用这两种分隔符,因为它可能会导致像 GNU make 示例由 < strong > unomadh 中那样的神秘错误。
来自 GNU 函数调用语法手册(重点是我的) :
[ ... ]如果参数本身包含其他函数调用或变量引用,最明智的做法是对所有引用使用相同类型的分隔符; 编写 $(subst a,b,$(x)),而不是 $(subst a,b,${x})。这是因为它更清晰,而且 因为只有一种类型的分隔符被匹配以查找引用的结尾。
$(subst a,b,$(x))
$(subst a,b,${x})
${}样式允许您测试 shell 中的 make 规则(如果您设置了相应的环境变量) ,因为它与 bash 兼容。
如果表达式包含不平衡的括号,则会产生差异:
${info ${subst ),(,:-)}} $(info $(subst ),(,:-)))
->
:-( *** insufficient number of arguments (1) to function 'subst'. Stop.
对于变量引用,这会对函数或包含括括号的变量名产生影响(坏主意)