Make:如何替换Make变量中的字符



我有一个变量,比如:

export ITEM={countryname}

这可以是:

   "Albania", 
   "United States"   // with space
   "Fs. Artic Land"  // dot
   "Korea (Rep. Of)" // braket
   "Cote d'Ivoir"    // '

这个变量$(ITEM)被传递给其他命令,有些命令需要原样(好吧,我将使用$(ITEM)),有些命令必须有字符替换,例如,要使用mkdir -p ../folder/{countryname}:

   "Albania"          // => Albania
   "United States"    // => United_States
   "Fs. Artic Land"   // => Fs._Artic_Land
   "Korea (Rep. Of)"  // => Korea_(Rep._Of)
   "Cote d'Ivoire"    // => Cote_d'Ivoire 

所以我需要一个新的制造变量,比如

export ITEM={countryname}
export escaped_ITEM=$(ITEM).processed_to_be_fine

我应该如何在我的makefile中进行字符替换(保持简单,不必执行外部脚本)。我在想用一些前奏曲tr什么的。

注意:在Ubuntu上工作。

您可以使用GNUMake中的subst函数来执行替换。

escaped_ITEM := $(subst $e ,_,$(ITEM))

(其中$e是一个未定义的或空的变量;感谢@EtanReisner指出了这一点)。

不过,每个单独的替换都需要一个subst

然而,如果可能的话,我建议不要这样做——使用单一的机器可读标记作为文件名,并将它们映射到只能由人类读取的标记,这是最后一步。这在你的makefile中也容易得多:

human_readable_us=United States
human_readable_kr=Korea (Rep. of)
human_readable_ci=Côte d'Ivoire
human_readable_tf=FS. Antarctic Lands
stuff:
        echo "$(human_readable_$(ITEM))"

给定输入,在shell中使用时只需"引用"国家/地区的"名称"就可以了(对于此处显示的少数字符串),但双引号任意字符串是不安全的,因为任何数量的东西都可以在双引号内计算(按照make的操作方式,即使字符串中的双引号本身也会引起问题)。

如果您需要将"随机"字符串传递到shell,那么只有一种安全的方法:将字符串中'(单引号)的每个实例替换为''',然后用'(双引号)包裹字符串。(根据字符串的使用者,用47替换每个'也可以。)

最新更新