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

Windows环境Makefile获取AWS参数时去除字符串双引号方案

问题原因

你当前的写法有两个核心问题,导致去引号逻辑完全不生效:

  1. %~1是Windows批处理里对传入脚本/函数的第一个位置参数去引号的语法,你写的set PROJECT = %~1这行没有传入任何参数,%1本身是空值,这行执行完根本不会修改PROJECT变量。
  2. Makefile中每一行命令都会启动独立的shell进程(Windows下是单独的cmd进程),就算你在某一行用set给cmd的环境变量赋值,下一行启动新cmd的时候根本读不到这个变量,属于两套完全隔离的变量体系。
可用方案

方案1(最推荐,全平台通用):从源头避免返回带引号的值

AWS CLI默认输出格式是json,用--query筛选字符串值时会自动包裹双引号,只要加上--output text参数,CLI会直接返回原始的纯文本值,不带任何引号,不需要额外做任何字符串处理,Windows/Linux/macOS环境下都能正常工作:

aws/project_name:
	@ $(eval PROJECT := $(shell aws ssm get-parameter --name "$(PROJECT_PARAMETER)" --query Parameter.Value --output text))
	@ echo $(PROJECT)

*注意:变量赋值用:=而非=,避免出现递归展开的异常。
执行后输出直接是MyProject,没有多余双引号。

方案2:用Make内置函数剥离引号

如果因为版本兼容等原因不能修改AWS CLI的输出参数,可以直接用Make自带的字符串处理函数去掉双引号——这个逻辑是Make程序本身实现的,不依赖底层shell的能力,全平台通用:

aws/project_name:
	@ $(eval PROJECT := $(shell aws ssm get-parameter --name "$(PROJECT_PARAMETER)" --query Parameter.Value))
	# 替换掉变量值中所有的双引号
	@ $(eval PROJECT := $(subst ",,$(PROJECT)))
	@ echo $(PROJECT)

如果需要更严谨,只去掉首尾的引号、保留字符串中间可能存在的双引号,可以用模式替换实现:

@ $(eval PROJECT := $(patsubst "%,%,$(patsubst %",%,$(PROJECT))))
额外说明

不要尝试在Makefile的单行命令里硬套Windows cmd的去引号逻辑,这类写法不仅调试成本高,还会导致Makefile完全失去跨平台兼容性,用上面两种基于Make本身能力或者AWS CLI原生参数的方案,稳定性高很多。

内容的提问来源于stack exchange,提问作者aerioeus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:18:34