Bash
Shell - 負文件通配
在 Bash 中,要進行否定文件 globbing,我有以下 2 個選擇。它們之間有區別嗎?兩者都返回相同的結果:
$ ls f1.txt f2.txt f3.txt f4.txt $ ls f[!24]* f1.txt f3.txt $ ls f[^24]* f1.txt f3.txt
該
[!...]
模式匹配不屬於...
方括號內集合的單個字元。這是 POSIX shell 使用的文件名通配模式。該
[^...]
模式的工作方式相同,但它是一個 POSIX 正則表達式。這種模式通常不能作為文件名通配模式移植到其他 shell,但bash
shell 會辨識它並將其視為與[!...]
模式相同。如果您在編寫文件名通配模式時可以在這兩者之間進行選擇,那麼您很可能應該使用可移植的 POSIX 變體
[!...]
。POSIX 標準一般說的是文件名
[...]
通配模式:如果一個開括號引入了一個括號表達式,如 XBD RE 括號表達式,除了
<exclamation-mark>
字元 (!
) 應替換<circumflex>
字元 (^
) 在正則表達式表示法中的非匹配列表中的角色之外,它應引入模式括號表達式。以不帶引號的字元開頭的括號表達式<circumflex>
會產生未指定的結果。否則,[
應匹配字元本身。“XBD RE 括號表達式”是正則表達式中的規範
[...]
。該標准
[^...]
在文件名通配模式中“未指定”使用 ,並且bash
shell(和其他一些)選擇將其實現為與[!...]
.