有人可以解释一下下面的awk
命令发生了什么吗?如果没有错误,那么为什么notme
没有打印,为什么我没有收到语法错误,那么对于右括号...}
需要用引号关闭...}'
?
$ awk '{print "me "$0 '"notme"} <<<"printme"
me printme
Run Code Online (Sandbox Code Playgroud)
那么我会尝试这个:
$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
me printme-at Wed Apr 11 16:41:34 DST 2018
Run Code Online (Sandbox Code Playgroud)
或者
awk '{print '"\"$(date)\""} <<<"run"
Wed Apr 11 16:56:38 DST 2018
Run Code Online (Sandbox Code Playgroud)
正如它所显示的,这意味着我可以使用 shell 命令替换来做任何事情。
这是一个错误吗?或者可能是我找不到的特殊状态。
对于第一个
Run Code Online (Sandbox Code Playgroud)$ awk '{print "me "$0 '"notme"} <<<"printme"
这里发生的事情是:
awk
逐字传递"notme"}
由shell解析,然后awk
作为结果字符串传递给notme}
awk
可以看到这个:
{print "me "$0 notme}
Run Code Online (Sandbox Code Playgroud)
由于awk
变量notme
没有值,这就是你得到的
对于第二个
Run Code Online (Sandbox Code Playgroud)$ awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at " me printme-at Wed Apr 11 16:41:34 DST 2018
我更倾向于这样写,使用一个awk
变量来携带的值$(date)
:
awk -v date="$(date)" '{print "me "$0 date}' <<<"printme-at "
me printme-at Wed Apr 11 13:43:31 BST 2018
Run Code Online (Sandbox Code Playgroud)
您已经问过为什么您的版本中没有语法错误。我们拆开来看:
# typed at the shell
awk '{print "me "$0 '"\"$(date)"\"} <<<"printme-at "
# prepared for awk
awk '{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}' <<<"printme-at "
# seen by awk
{print "me "$0 "Wed Apr 11 16:41:34 DST 2018"}
Run Code Online (Sandbox Code Playgroud)
双引号字符串在接近它"\"$(date)\""
之前awk
被shell 解析,并被评估(由 shell)作为类似于文字字符串"Wed Apr 11 13:43:31 BST 2018"
(包括双引号)的东西。我不明白为什么需要有语法错误,因为你写的东西是有效的——虽然读起来有些曲折。