Bash

Shell - 負文件通配

  • January 24, 2022

在 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,但bashshell 會辨識它並將其視為與[!...]模式相同。

如果您在編寫文件名通配模式時可以在這兩者之間進行選擇,那麼您很可能應該使用可移植的 POSIX 變體[!...]

POSIX 標準一般說的是文件名[...]通配模式:

如果一個開括號引入了一個括號表達式,如 XBD RE 括號表達式,除了<exclamation-mark>字元 ( !) 應替換<circumflex>字元 ( ^) 在正則表達式表示法中的非匹配列表中的角色之外,它應引入模式括號表達式。以不帶引號的字元開頭的括號表達式<circumflex>會產生未指定的結果。否則,[應匹配字元本身。

“XBD RE 括號表達式”是正則表達式中的規範[...]

該標准[^...]在文件名通配模式中“未指定”使用 ,並且bashshell(和其他一些)選擇將其實現為與[!...].

引用自:https://unix.stackexchange.com/questions/687647