在许多文章中,他们从来没有在 glob 中包含 '!',这是错误的。那么, ! 真正属于 哪里?
我在 glob 中使用了 ! 例如。ls lis[!ta]*
这是否意味着 ! 是 glob 的一部分?
答案1
!
在 shell 全局变量和正则表达式中均有使用。它不“属于”其中任何一者。
在您给出的例子中:
ls lis[!ta]*
这是 POSIX 否定(或补充)字符类的方式。从man 7 glob
Complementation An expression "[!...]" matches a single character, namely any character that is not matched by the expression obtained by removing the first '!' from it. (Thus, "[!]a-]" matches any single character except ']', 'a' and '-'.)
(一些 shell 还支持^
补码,以与正则表达式语法保持一致)。它也用于 ksh/bash扩展的 glob为了类似的目的,例如
!(foo|bar)
匹配除foo
或之外的任何字符bar
。有关此用法,请参阅 shell 的手册页 -man bash
例如:
?(pattern-list) Matches zero or one occurrence of the given patterns *(pattern-list) Matches zero or more occurrences of the given patterns +(pattern-list) Matches one or more occurrences of the given patterns @(pattern-list) Matches one of the given patterns !(pattern-list) Matches anything except one of the given patterns
在 perl 兼容正则表达式 (PCRE) 中, !
也用于否定环视,例如
foo(?!bar)
匹配foo
除其后跟 之外的字符bar
。例如参见