M4看到字符串中的文件结尾



我得到了一个m4解析错误,它在以下行的第二行中看到了一个EOF字符(将在一个单独的shell中执行:

"set V1 = `grep -c  'z = 10.0e-6'     qt_data/kxfo_ssr_udfo_tmp/* | wc -l`;
set V2 = `grep -c  'z = -30.0e-6'    qt_data/kxfo_ssr_udfo_tmp/* | wc -l`;
test $V1 > 0;
test $V1 = $V2 "

我得到的错误是:<path-to-file>:<line>:ERROR: end of file in string

(为了清楚起见:给出问题的行是:set V2 = `grep -c 'z = -30.0e-6' qt_data/kxfo_ssr_udfo_tmp/* | wc -l`;(

我正试图找出M4可以看到哪些字符组合,以及如何将其作为EOF进行转义,因为命令本身在shell中工作时没有问题。

有人知道我如何修复错误吗,因为我找不到M4认为是EOF的字符组合?

虽然可行,但一个不理想的解决方案可能是使用changequote内置宏:

  1. 选择一个不存在的字符作为开始引号,选择一个结束字符作为结束引号。例如:changequote("""", """);在这里,您对m4解释器说""""是开始引号,"""是结束引号,从现在起直到解释器找到宏changequote()

  2. 要扭转这种行为(也就是说,从你不希望这种假设的角度回到引号的标准定义(,你需要使用不带参数的内置宏changequote()

默认情况下,grave重音和accute重音是左引号和右引号字符串。这样可以防止识别特殊字符。它也被视为一个单独的令牌(一个带引号的字符串(,其值是去掉一级引号的引号之间的文本

引号字符可以嵌套,但必须保持平衡。

$ m4 test.m4
define(`foo', `This is macro `foo'.')dnl
foo
=> This is macro foo.

在您的情况下,后引号不是M4左引号字符串,而是一个必须由shell专门解释的字符(命令替换(。换句话说,默认的左引号字符串会干扰最终文本。

changequote(`[',`]')dnl
nb_files=`find . -type f | wc -l`; echo $nb_files
changequote`'dnl

注意:您应该使用changequote来重新设置默认的引用字符串,因为changequote()是未指定的(参见POSIX规范(。

注意:更改引用字符串时应小心(例如,请参见下文(。

$ m4 test2.m4
divert(`-1')
changequote(`[',`]')
define([foo], [syscmd(false)ifelse(sysval,[0],,
[m4exit([1])])])
changequote
divert`'dnl
foo
error-> m4:foo.m4:7: non-numeric argument to builtin `m4exit'

最新更新