m4_toupper为变量返回空字符串

时间:2013-09-13 19:19:19

标签: bash autotools autoconf m4

我想以大写字母打印出一个字符串变量。我试图使用m4_toupper宏,但我的变量似乎被忽略了。

例如,给出以下代码:

foobar="linux-gnu"
echo "${foobar}"
echo m4_toupper("x${foobar}")
echo "${foobar}"

结果如下:

linux-gnu
X
linux-gnu

由于x大写,我怀疑m4宏工作正常,但可能没有收到我的变量字符串 - 但是,echo语句似乎工作正常。为什么返回一个空字符串?

2 个答案:

答案 0 :(得分:1)

不知道m4宏,但是这里有一些方法可以将变量转换为大写:

$ echo $foobar | awk '{print toupper($0)}'
LINUX-GNU

$ echo $foobar | tr '[a-z]' '[A-Z]'
LINUX-GNU

$ echo ${foobar^^}
LINUX-GNU

答案 1 :(得分:1)

您的宏不会被忽略,只会在您预期的不同时间进行评估。 在configure 创建时评估M4sugar宏。您似乎希望在configure 运行时应用toupper功能。您可以在创建时通过以下方式执行此操作:

m4_define([thestring], [linux-gnu])dnl
m4_define([thexstring], [x])dnl
m4_append([thexstring], m4_toupper(thestring))dnl
foobar="thestring"
echo "${foobar}"
echo "thexstring"
echo "${foobar}"

但如果在运行时设置foobar,这将无济于事。然后你将不得不求助于Fredrik Pihl建议的一种运行时技术(或类似的东西)。

在任何情况下,m4_toupper("x${foobar}")都会更改为"X${FOOBAR}",这就是为什么它没有出现,因为${FOOBAR}未在环境中定义。