该怎么办

该怎么办

当我用作!字段分隔符时,例如awk -F!它给出错误消息bash: !: event not found。为什么?它正在接受awk -F"\!"。 bash 版本 3.2.25

答案1

!是 Bash 的触发字符历史扩展。如果启用该功能,则!foo命令行上的类似内容将扩展为以foo.或者,如果没有这样的命令行,shell 会给出错误,如下所示。

但它不应该作为单词的最后一个字符执行任何操作。这实际上在我尝试过的所有 Bash 版本中都按照您的预期工作:

$ echo 'aa!bb' | awk -F! '{print $1}' 
aa

在更新的版本中,!也不应该在结束双引号之前执行任何操作,因此-F"!"在更高版本中有效,但在 3.2 中无效。

反斜杠或单引号可以用来转义它,即既不扩展\!foo也不'!foo'扩展。当然,您也可以通过完全禁用历史扩展来阻止它,使用set +H.

如果加上双引号就更奇怪了。在其中,反斜杠禁用历史扩展,但反斜杠本身保留在原处:

$ printf '%s\n' "\!foo"
\!foo

在这种情况下,awk -F"\!"这是有效的,因为 awk 本身删除了反斜杠。

答案2

并不是awk那个人在做这件事。这是外壳。!是 shell 中的特殊字符。

该怎么办

总是引用你的论点。例如

awk -F'!'

相关内容