如何在Makefile中为每个AWS子网ID字符串单独包裹双引号
Makefile 格式化逗号分隔子网ID实现方案
不需要用substr做逐位字符串截取,用Makefile内置的文本处理函数就能快速实现,步骤非常简单,对不熟悉Makefile语法的使用者也友好。
完整可运行示例
# 提前定义分隔符变量,规避Makefile语法解析冲突 empty := comma := , space := $(empty) $(empty) # 原始AWS查询返回的子网字符串 RAW_SUBNETS := "subnet-013e3be0be24cb26d, subnet-067b5d1d322c7e1f0, subnet-02a2cc16c6b258d35" # 第一步:去掉原始字符串最外层包裹的整对双引号 STRIPPED_RAW := $(patsubst "%",%,$(RAW_SUBNETS)) # 第二步:把字符串里的「逗号+空格」分隔符替换成单个空格,转成Makefile原生支持的空格分隔列表 SUBNET_LIST := $(subst $(comma)$(space),$(space),$(STRIPPED_RAW)) # 第三步:给列表里的每个子网ID前后都加上双引号 QUOTED_SUBNETS := $(addprefix ",$(addsuffix ",$(SUBNET_LIST))) # 第四步:把带双引号的子网项用「逗号+空格」重新拼接,得到目标格式 FORMATTED_SUBNETS := $(subst $(space),$(comma)$(space),$(QUOTED_SUBNETS)) # 测试目标,执行make test即可打印结果验证 test: @echo "原始字符串: $(RAW_SUBNETS)" @echo "格式化结果: $(FORMATTED_SUBNETS)"
实现说明
- 提前定义
comma、space变量是为了避开Makefile的默认语法规则:直接在函数参数里写逗号会被识别为参数分隔符,直接写多个空格会被自动折叠为单个空格,用变量中转可以完全避免这类解析异常。 - 整个逻辑不依赖Shell外部命令,纯Makefile原生函数实现,跨环境执行不会因为Shell差异出问题。
- 该写法没有硬编码子网数量,只要原始输入保持「整串双引号包裹、子网ID间用逗号加空格分隔」的格式,不管后续返回多少个子网,都能自动完成格式化,不需要修改规则。
执行make test就能看到输出完全符合预期:
原始字符串: "subnet-013e3be0be24cb26d, subnet-067b5d1d322c7e1f0, subnet-02a2cc16c6b258d35" 格式化结果: "subnet-013e3be0be24cb26d", "subnet-067b5d1d322c7e1f0", "subnet-02a2cc16c6b258d35"
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

