Makefile嵌套if语句报错:unexpected token `fi'语法错误
问题分析与解决
你的Makefile报错核心是两个问题:shell命令块重复使用Make的@前缀,以及POSIX标准shell不支持==做字符串比较。
错误原因拆解
- 重复的
@前缀:Makefile中用反斜杠连接的多行属于同一个shell进程,@是Make的控制符(用来隐藏命令本身的输出),只需在整个shell块的最开头加一次即可。你在else、内层if前重复加@,会被shell当成命令的一部分,直接导致语法解析失败。 - 不兼容的比较符:Unix默认的
/bin/sh是POSIX兼容shell,test命令(即[)的字符串比较只能用=,==是bash的扩展语法,在标准sh下会触发错误。
修正后的Makefile代码
package: @echo Making Package; \ if [ "$(PRODUCT)" = "PROD_1" ]; then \ echo configure PROD_1; \ "./$(CONFIG_AREA)/copier.sh" "$(CONFIG_AREA)/Prod1_configuration" "$(STAGING_AREA)"; \ elif [ "$(PRODUCT)" = "PROD_2" ]; then \ echo configure PROD_2; \ "./$(CONFIG_AREA)/copier.sh" "$(CONFIG_AREA)/Prod2_configuration" "$(STAGING_AREA)"; \ fi -@cp "$(STAGING_ZIP_AREA)/version.txt" "$(STAGING_AREA)"
关键修改说明
- 用
elif替代嵌套else if,简化结构,减少多层fi的语法风险 - 整个shell块仅在开头加
@,后续命令行不再重复添加 - 将
==替换为POSIX标准的=,保证跨shell兼容性 - 所有变量引用、命令路径用双引号包裹,避免变量含空格或特殊字符时出现参数拆分错误
内容的提问来源于stack exchange,提问作者Alan J
相关产品推荐
相关产品推荐

