0

我正在尝试查找$未跟随的实例!

那应该是必要$的,逃逸的,哪个是逃逸的\\$[^!]哪个应该是逃逸[^\\!]的,除非[]需要逃逸?不确定这个 - 对 bash 还不够了解。

ag "\\$[^\!]"
bash: ^\!: syntax error: operand expected (error token is "^\!")

ag "\\$[^!]"
bash: !]: event not found

ag "\\$[^\\!]"
bash: ^\\!: syntax error: operand expected (error token is "^\\!")

ag "\\$[\\^\\!]"
bash: \\^\\!: syntax error: operand expected (error token is "\\^\\!")

ag "\\$[\^\!]"
bash: \^\!: syntax error: operand expected (error token is "\^\!")

这些不会产生任何结果:

ag "\\$\\[\\^\\!\\]"
ag "\\$\\[\\^\\!\\]"
ag "\\$\[\\^\\!\]"
ag "\\$\[\^\!\]"
ag "\$\[\^\!\]"
ag "\\$\[\^\!\]"
4

1 回答 1

5

如有疑问,请使用单引号 -- 和字符类。

ag '[$][^!]'
  • 单引号防止!被视为历史扩展字符(bash 用 shell 历史中的命令替换命令的指令)。
  • 单引号防止反斜杠被解释为转义序列的一部分,确保它们按字面意思传递。
  • [$] 比 更清楚\$:如果我们处于不同类型的引用上下文中,则\可能会被该上下文消耗;方括号不太容易被误解。(如果有一个名为的文件$并且我们处于完全未引用的上下文中,则可以将其视为 glob 表达式......但与反斜杠情况相关的关注点要小得多)。

此外,鉴于您的目标不是手指与 1970 年代和 1980 年代的外壳兼容,请考虑在您的角色中添加以下内容~/.bashrc以使!角色不再特殊(仅在交互式外壳中,使其行为偏离脚本):

set +H
于 2018-02-01T21:29:18.347 回答