有人可以解释一下下面的awk
命令发生了什么吗?如果没有错误,那么为什么notme
没有得到打印,为什么我没有得到语法错误,那么对于右括号...}
需要用引号关闭...}'
?
$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme
然后我会尝试这个:
$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018
或者
awk '{print '"\"$(date)\""} <<<"run"
Wed Apr 11 16:56:38 DST 2018
正如它所显示的,这意味着我可以使用 shell 命令替换来做所有事情。
这是一个错误吗?或者也许是我找不到的特殊状态。
对于第一个
这里发生的是:
awk
单引号中的部分被逐字传递"notme"}
由 shell 解析,然后awk
作为结果字符串传递给notme}
awk
看到这个:由于
awk
变量notme
没有价值,这就是你得到的对于第二个
我更倾向于这样写,使用一个
awk
变量来携带 的值$(date)
:你问过为什么你的这个版本没有语法错误。让我们把它拆开:
双引号字符串在到达它附近
"\"$(date)\""
之前由 shell 解析awk
,并且(由 shell)评估为类似于文字字符串"Wed Apr 11 13:43:31 BST 2018"
(包括双引号)的东西。我不明白为什么需要出现语法错误,因为您所写的内容是有效的——尽管读起来有些曲折。单引号结束
awk
在 shell 中分隔程序的字符串。awk
自己永远看不到它。然后,您将程序的初始部分与命令替换提供的更多字符串和 shell 中的静态字符串连接起来。这一切都发生在awk
被调用之前。当然,您可以使用命令替换来修改稍后
awk
作为其代码读取的字符串,但它并不能真正使代码易于阅读,并且在 shell 的引用规则、分词等方面可能相当脆弱。最好以
awk
通常的方式设置一个变量: