在GNU Make中,如何将变量转换为小写?

Don*_*Gar 49 makefile

这是一个愚蠢的问题,但....与GNU Make:

VAR = MixedCaseText
LOWER_VAR = $(VAR,lc)

default:
        @echo $(VAR)
        @echo $(LOWER_VAR)
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,将VAR的内容转换为小写的正确语法是什么?显示的语法(以及我遇到的其他所有内容)导致LOWER_VAR为空字符串.

vrd*_*dhn 48

你总能产生tr

LOWER_VAR = `echo $(VAR) | tr A-Z a-z`
Run Code Online (Sandbox Code Playgroud)

要么

LOWER_VAR  = $(shell echo $(VAR) | tr A-Z a-z)
Run Code Online (Sandbox Code Playgroud)

您尝试调用的'lc'函数来自GNU Make Standard Library

假设已安装,将使用正确的语法

LOWER_VAR  = $(call lc,$(VAR))
Run Code Online (Sandbox Code Playgroud)

  • 就我而言, $(call lc,$VAR) 语法也会导致空字符串。我猜想该库尚未安装,并且要求所有开发人员安装它对我来说并不是最佳选择。然而,衍生正在发挥作用。 (2认同)

Eri*_*ski 46

您可以直接在gmake中执行此操作,而无需使用GNU Make Standard Library:

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)
Run Code Online (Sandbox Code Playgroud)

它看起来有点笨重,但它完成了工作.

如果你用$(壳)品种去,请不要使用:=,而不是只=,如LOWER_VAR := $(shell echo $VAR | tr A-Z a-z).这样,您只在声明变量时调用shell一次,而不是每次引用变量时调用shell!

希望有所帮助.

  • 无论操作系统和shell工具如何,我见过的唯一解决方案. (4认同)
  • @mtalexan 但它不起作用;AZ 仅涵盖您可能希望转换为小写的一小部分字符。É.h, Проблемы.c 等等等等等等。 (2认同)

Rei*_*ilo 19

处理带重音的大写字母:

LOWER_VAR  = $(shell echo $VAR | tr '[:upper:]' '[:lower:]')
Run Code Online (Sandbox Code Playgroud)

结果:

$ VAR="Éclipse"
$ echo $VAR | tr A-Z a-z
Éclipse
$ echo $VAR | tr '[:upper:]' '[:lower:]'
éclipse
Run Code Online (Sandbox Code Playgroud)

  • 我相信你的意思是“LOWER_VAR = $(shell echo $(VAR) | tr '[:upper:]' '[:lower:]')”。如果没有回声,这就没有意义。 (2认同)

alt*_*dky 7

我觉得这稍微干净一点......

$(shell tr '[:upper:]' '[:lower:]' <<< $(VAR))
Run Code Online (Sandbox Code Playgroud)

  • 这需要 shell 支持 &lt;&lt;&lt; (7认同)