Makefile 在GNU Make中,如何将变量转换为小写?
这是一个愚蠢的问题,但是。。。。使用GNU Make:Makefile 在GNU Make中,如何将变量转换为小写?,makefile,Makefile,这是一个愚蠢的问题,但是。。。。使用GNU Make: VAR = MixedCaseText LOWER_VAR = $(VAR,lc) default: @echo $(VAR) @echo $(LOWER_VAR) 在上面的示例中,将VAR的内容转换为小写的正确语法是什么?所显示的语法(以及我遇到的所有其他语法)导致LOWER_VAR是一个空字符串。您总是可以派生出tr LOWER_VAR = `echo $(VAR) | tr A-Z a-z` 或
VAR = MixedCaseText
LOWER_VAR = $(VAR,lc)
default:
@echo $(VAR)
@echo $(LOWER_VAR)
在上面的示例中,将VAR的内容转换为小写的正确语法是什么?所显示的语法(以及我遇到的所有其他语法)导致LOWER_VAR是一个空字符串。您总是可以派生出tr
LOWER_VAR = `echo $(VAR) | tr A-Z a-z`
或
您试图调用的“lc”函数来自
假设已安装,则正确的语法为
LOWER_VAR = $(call lc,$(VAR))
您可以在gmake中直接执行此操作,而无需使用GNU Make标准库:
lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
VAR = MixedCaseText
LOWER_VAR = $(call lc,$(VAR))
all:
@echo $(VAR)
@echo $(LOWER_VAR)
它看起来有点笨重,但它完成了任务
如果您使用$(shell)品种,请使用:=
,而不仅仅是=
,如下变量:=$(shell echo$VAR | tr A-Z A-Z)
。这样,您只需在声明变量时调用shell一次,而不是每次引用变量时
希望能有所帮助。要使用重音处理大写字母:
LOWER_VAR = $(shell echo $VAR | tr '[:upper:]' '[:lower:]')
结果:
$ VAR="Éclipse"
$ echo $VAR | tr A-Z a-z
Éclipse
$ echo $VAR | tr '[:upper:]' '[:lower:]'
éclipse
我觉得这个稍微干净一点
$(shell tr '[:upper:]' '[:lower:]' <<< $(VAR))
$(shell tr'[:upper:][:lower:][:lower:][p>如果安装了Python,它甚至可以在Windows上运行:
$(shell python-c“print('$(VAR)'.lower())”)
GNU make不包含用于大小写转换的字符串函数。因此,默认情况下没有定义lc
函数
但是GNU Make通常支持GNU Guile(例如,Fedora 33就是这样)
因此,您可以调用Guile函数来转换案例:
VAR = MixedCaseText
LOWER_VAR = $(guile (string-downcase "$(VAR)"))
default:
@echo $(VAR)
@echo $(LOWER_VAR)
或者,如果要封装Guile调用:
VAR = MixedCaseText
LOWER_VAR = $(call to_lower,$(VAR))
define to_lower
$(guile (string-downcase "$(1)"))
endef
default:
@echo $(VAR)
@echo $(LOWER_VAR)
在我的例子中,$(call lc,$VAR)语法也会导致一个空字符串。我猜库没有安装,并且要求所有开发人员都安装它对我来说不是最佳选择。但是,生成正在工作。或者,在它周围放一个$(strip)以去掉末尾的换行符:$(strip($shell echo$(VAR))| tr A-Z A-Z)要删除所有空格,请尝试LOWER_VAR=$(shell$VAR | tr'[:upper:''[:LOWER:''.\sed's///g')
我相信您的意思是“LOWER_VAR=$(shell echo$(VAR)|tr'[:upper:'[:LOWER:'[:LOWER:'.]。如果没有回音,这就没有意义。是的-另一种方法是将$VAR
替换为$1
,因此用法将是$(调用较低的\u VAR、value或$V或$(变量))
。通常,我只引用我的echo语句:echo'$1'
不是万无一失的,但它减少了重定向、shell扩展等的机会。我所看到的唯一一个解决方案是,不管操作系统和shell工具如何,都能工作。@mtalexan它不起作用;a-Z只包含可能要转换为较低c的字符的一小部分ase.É.h,ПППбббхы.c等@James Moore,你是对的,但另一个答案中给出的tr语法也不能保证在非bash Shell上得到支持。从技术上讲,上面给出的语法将支持所有ASCII字符,并且可以根据需要扩展为Unicode字符,因为它是一个“除法”的很好例子并征服需要shell支持的应用程序:)
VAR = MixedCaseText
LOWER_VAR = $(call to_lower,$(VAR))
define to_lower
$(guile (string-downcase "$(1)"))
endef
default:
@echo $(VAR)
@echo $(LOWER_VAR)