首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Bash 大括號展開:笛卡爾積生成字符串序列原理解析

     編輯:程式設計綜合問答

現象演示

$ echo {file1,file2}:{A,B,C}
file1:A file1:B file1:C file2:A file2:B file2:C

核心機制:Brace Expansion (大括號展開)

  • Bash 在**解析階段** (命令執行前) 對包含大括號的詞進行展開。
  • 形式:`{x,y,z}` 展開為 `x y z` (空格分隔)。
  • **嵌套/多組展開**:按**笛卡爾積**順序組合,左邊變化慢,右邊變化快。

執行過程圖解

原始命令:echo {file1,file2}:{A,B,C}

第 1 步:展開第一組 {file1,file2}
  → echo file1:{A,B,C} file2:{A,B,C}

第 2 步:展開第二組 {A,B,C} (對每個前綴)
  → echo file1:A file1:B file1:C file2:A file2:B file2:C

第 3 步:echo 打印所有參數 (空格分隔)
  → file1:A file1:B file1:C file2:A file2:B file2:C

進階用法

語法展開結果說明
`{1..5}``1 2 3 4 5`數字序列 (Bash 3.0+)
`{a..e}``a b c d e`字母序列
`{01..10}``01 02 ... 10`零填充寬度自動推斷
`{1..10..2}``1 3 5 7 9`步長 (Bash 4.0+)
`file_{1..3}.txt``file_1.txt file_2.txt file_3.txt`前綴/後綴擴展
`{{A,B},{C,D}}``A B C D`嵌套展開 (扁平化)
`cp file.txt file.txt.{bak,orig}``cp file.txt file.txt.bak file.txt.orig`實戰:備份文件

常見陷阱

  • 變量不展開:`var="1 2"; echo {$var}` → 輸出字面量 `{1 2}`。大括號展開發生在**變量擴展之前**。解決:用 `eval` 或改寫邏輯。
  • 空格處理:`{a, b}` 展開為 `a b` (含空格),若需帶空格字符串需加引號:`"{a, b}"`。
  • 性能:極大範圍展開 (如 `{1..100000}`) 會生成巨大參數列表,超過 `ARG_MAX` 導致命令失敗。改用循環。

最佳回答核心

「這是一個 json 片段,輸出的時候會得到笛卡爾積。也就是第一個集合每個元素匹配第二個集合的的每個元素。」—— 雖稱其為 JSON 片段不準確 (實為 Bash 語法),但精準說明了笛卡爾積本質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved