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进行转义,因为该命令本身在外壳中运行时没有问题。

有人找不到我可以解决错误,因为我找不到M4视为EOF的字符组合吗?

解决方法

尽管可行的解决方案可能并不理想,但可能是使用let request = MKLocalSearch.Request() request.naturalLanguageQuery = "addressToBeSearched" request.region = MKCoordinateRegion(center: span: ) let localSearch = MKLocalSearch(request: request) localSearch.start { response,error in // returns (MKLocalSearch.Response?,Error?) -> Void // which ultimately has an array of MKMapItem from which you can extract a placemark. } 内置宏:

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

  2. 要扭转这种行为(意味着,从您不再希望这种假设的角度回到报价的标准定义),您需要使用不带参数的内置宏changequote()

,

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

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

 $ 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'