我有一个变量:
export ITEM={countryname}
这可以是:
"Albania",
"United States" // with space
"Fs. Artic Land" // dot
"Korea (Rep. Of)" // braket
"Cote d'Ivoir" // '
这个变量$(ITEM)
被传递给其他命令,有些需要就是它(很好,我将使用$(ITEM)
),例如,某些必须有字符替换,以便与{{1}一起使用}:
mkdir -p ../folder/{countryname}
所以我需要一个新的make变量
"Albania" // => Albania
"United States" // => United_States
"Fs. Artic Land" // => Fs\._Artic_Land
"Korea (Rep. Of)" // => Korea_\(Rep\._Of\)
"Cote d'Ivoire" // => Cote_d\'Ivoire
我应该如何在makefile中进行此字符替换?(为了简单起见而不必执行外部脚本)。我正在考虑使用一些转换export ITEM={countryname}
export escaped_ITEM=$(ITEM).processed_to_be_fine
或其他东西。
注意:在Ubuntu上工作。
答案 0 :(得分:3)
您可以使用GNU Make中的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))"
答案 1 :(得分:2)
只需输入"引用"国家"名称"在shell中使用它们时工作正常(对于这里显示的少数几个)但是双引用任意字符串是不安全的,因为任何数量的东西仍然可以在双引号内进行求值(并且make的方式甚至可以在字符串中操作双引号导致问题)。
如果你需要通过"随机"字符串到shell它们只是一种安全的方法:用'
替换字符串中的'\''
(单引号)的每个实例,然后将字符串包装在'
中(单个引号)。 (取决于使用'
替换每个\047
的字符串的使用者也可以。)