问题描述
我收到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.
}
内置宏:
-
选择一个不存在的字符作为结束引号,将结束字符视为结束引号。例如:
changequote
;在这里,您对m4解释器说,changequote("""",""")
是开始引号,""""
是结束引号,直到从解释器找到宏"""
为止。 -
要扭转这种行为(意味着,从您不再希望这种假设的角度回到报价的标准定义),您需要使用不带参数的内置宏
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'