使用语法${var}
和$(var)
调用变量有什么区别吗?例如,变量展开的方式或其他方面是否有区别?
这两者没有区别——它们在GNU Make和POSIX make中完全相同。
我认为$(圆括号)
看起来更整洁,但这只是个人喜好。
(其他答案指向了GNU Make文档的相关部分,并指出不应在单个表达式中混合使用语法)
deploy: ${DEPS}
标记为语法错误,但显示deploy: $(DEPS)
是正确的,即使在make
中调用时两种拼写都具有相同的效果。 - amacleodifeq
条件语句需要使用圆括号进行相等性检查。你不能在该行中安全地使用花括号。因此,我更喜欢使用$(round brackets)
。 - Teemu Ilmonen变量引用基础章节来自GNU make
文档,声明“没有任何区别”:
要替换变量的值,请在括号或花括号中写入变量名称的美元符号:无论是
$(foo)
还是${foo}
都是对变量foo的有效引用。
$(subst a,b,$(x))
,而不是$(subst a,b,${x})
。这是因为它更清晰,且只有一种类型的分隔符与找到参考的结尾相匹配。”$(subst a,b,$(x))
和$(subst a,b,${x})
以及${subst a,b,$(x)}
和${subst a,b,${x}}
都产生相同的结果。只匹配一个分隔符的推理几乎没有意义——当然,如果引用以(开头,它必须以)结尾,$(x}
显然是错误的,但似乎与混合不同引用的语法无关。除了像unomadh这样变量名是逗号的病态情况外,混合语法似乎可以工作。 - Mark Gates${}样式允许您在shell中测试make规则,如果您设置了相应的环境变量,则与bash兼容。
实际上,看起来相当不同:
, = ,
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.
但到目前为止,我只在变量名称中包含逗号时发现了这种差异。我原以为${...}会将逗号展开为值的一部分,但事实证明我无法以这种方式操纵它。我仍然不理解这个问题… 如果有人有解释,我很乐意知道!
${info ${subst ${,},-,${list}}_EOL}
可以与所有大括号一起使用,因此似乎是混合圆括号和大括号的错误。 - Mark Gates如果表达式中包含不平衡的括号,那么这会产生巨大的影响:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.