如何在Makefile中使用Bash 4语法实现字符串首字母大写
在Makefile中使用Bash原生语法实现字符串首字母大写
你的问题核心在于Make和Bash的变量解析优先级冲突:当你写$(shell echo ${L1^})时,Make会先尝试解析${L1^}——它把这当成一个名为L1^的Make变量,但这个变量根本不存在,所以实际传给Bash的命令是echo (空内容),自然输出为空。
下面给你两种不依赖tr/sed、纯用Bash原生语法的解决方案,都能把结果赋值给变量:
方法1:转义Make的变量解析(最简洁)
在Make语法里,$$会被解析成单个$,这样Bash就能正确识别${var^}的首字母大写语法。我们只需要把Make的变量传递给Bash环境,再执行命令:
SHELL := /bin/bash L1 = en # 用$$转义$,让Bash处理${L1^},同时把Make的L1变量注入Bash环境 Ll1 := $(shell export L1=$(L1); echo "$${L1^}") all: @echo $(Ll1)
运行这个Makefile,你会得到输出En,且结果已经存在Ll1变量中。
方法2:通过参数传递变量值
如果你不想处理环境变量,也可以直接把Make变量的值作为参数传给Bash的命令行:
SHELL := /bin/bash L1 = en # 把$(L1)作为参数传给bash -c,在Bash中用${0^}处理首字母大写 Ll1 := $(shell bash -c 'echo "${0^}"' $(L1)) all: @echo $(Ll1)
这个写法更直接,跳过了环境变量的传递,同样能得到正确的结果。
两种方法都完全依赖Bash 4+的${var^}语法,不需要额外的文本处理工具,且都满足你“将结果赋值给变量”的需求。
内容的提问来源于stack exchange,提问作者Proyag
相关产品推荐
相关产品推荐

