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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:59:18