Brace-Expansion

a 和有什麼不一樣bcbCbcd(括號)和a{b,c}d(大括號)?

  • June 7, 2019

a[bc]d和 和有什麼不一樣a{b,c}d?為什麼人們a{b,c}d在已經有的時候使用a[bc]d

兩者完全不同。

a[bc]d是一個文件名模式(在 以外的 shell 中fish)。它將擴展到兩個文件名 abdacd如果它們是目前目錄中現有文件的名稱。

  • [...]部分是一個括號表達式,它匹配列出的字元中的單個字元(或在包括範圍時整理元素)。要匹配模式a[bc]d,字元串之間ad文件名中的字元必須是 ab或 a c
  • 如果abd存在但acd不存在,那麼它只會擴展為abd,反之亦然。
  • 如果兩者都不存在abd,也不acd存在,具體取決於 shell 和選項,它會觸發錯誤(原始 Unix sh(t)cshzshfishbash -O failglob)並可能退出 shell,或者保持模式未擴展¹(Bourne-like 和rc-like shell)或擴展為什麼都沒有(bash/zsh/yash -o nullglob、一些舊版本的fish、原始 Unixsh以及(t)csh同一命令中是否有其他匹配的 glob)。

a{b,c}d是一個大括號擴展(在支持這些的 shell 中)。它將擴展到兩個字元串 abdacd.

  • {...}部分是一組以逗號分隔的字元串(在此範例中;在某些 shell 中,它也可能是一個範圍,例如a..k20..25更高級的範圍,例如00..20..2or 0..20..2%02d),並且通過將這些字元串中的每一個與側翼組合來計算擴展字元串ad. 這些字元串可能比單個字元長,也可能是大括號擴展本身。
  • 無論這些字元串是否對應於現有文件名,都會發生擴展。

如果您正在構造字元串,請使用大括號擴展。如果要匹配文件名,請使用文件名模式。


¹在這種特殊情況下,a[bc]d可能恰好是現有文件的名稱,這就是為什麼rm -f ./*.[ch]在這些 shell 中使用類似的東西可能很危險,而且rm -f ./*.{c,h}問題不大。

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