You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile嵌套if语句报错:unexpected token `fi'语法错误

问题分析与解决

你的Makefile报错核心是两个问题:shell命令块重复使用Make的@前缀,以及POSIX标准shell不支持==做字符串比较。

错误原因拆解

  1. 重复的@前缀:Makefile中用反斜杠连接的多行属于同一个shell进程,@是Make的控制符(用来隐藏命令本身的输出),只需在整个shell块的最开头加一次即可。你在else、内层if前重复加@,会被shell当成命令的一部分,直接导致语法解析失败。
  2. 不兼容的比较符: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:55:00