Bash 的花括號擴展(brace expansion){start..end}
是一個強大而靈活的語法特性,用于生成特定序列或組合。它在腳本編寫、爆破字典生成、文件批量操作以及模式匹配中有著廣泛的應用。本文將從基礎用法到高級技巧,帶你全面掌握這一功能。
1. 基礎用法:從簡單序列開始
{start..end}
是 Bash 花括號擴展的核心語法,用于生成從 start
到 end
的連續序列,支持數字和字母。
1.1 數字序列
echo {1..5}
- 輸出:
1 2 3 4 5
- 用途:快速生成連續數字列表。
1.2 字母序列
echo {a..e}
- 輸出:
a b c d e
- 說明:支持小寫和大寫字母,基于 ASCII 順序。
1.3 帶步長的序列(Bash 4.0+)
echo {1..10..2}
- 輸出:
1 3 5 7 9
- 格式:
{start..end..increment}
,步長可正可負。 - 示例:
{10..1..-2}
輸出10 8 6 4 2
。
1.4 反向序列
echo {5..1}
- 輸出:
5 4 3 2 1
- 提示:無需顯式步長,默認遞減 1。
2. 進階用法:組合與擴展
花括號擴展的真正威力在于其組合能力和靈活性。
2.1 多范圍組合(笛卡爾積)
多個 {..}
緊鄰時,會生成所有可能的組合:
echo {a..c}{1..2}
- 輸出:
a1 a2 b1 b2 c1 c2
- 原理:類似數學中的笛卡爾積。
2.2 用逗號合并集合
用逗號分隔的項構成并集:
echo {a,b,c}
- 輸出:
a b c
嵌套范圍:
echo {{a..c},{0..1}}
- 輸出:
a b c 0 1
- 注意:這是并集而非組合。
復雜組合:
echo {{a..c},{0..1}}{x,y}
- 輸出:
ax ay bx by cx cy 0x 0y 1x 1y
- 總項數:5 × 2 = 10。
2.3 添加前綴和后綴
echo user{1..3}@domain.com
- 輸出:
user1@domain.com user2@domain.com user3@domain.com
- 用途:生成批量用戶名、URL 等。
2.4 空格分隔的獨立擴展
空格分隔的 {..}
各自獨立擴展:
echo {a..b} {1..2}
- 輸出:
a b 1 2
- 區別:與緊鄰的笛卡爾積不同。
2.5 數字填充(補零)
echo {01..05}
- 輸出:
01 02 03 04 05
- 規則:以起始值的位數為準,自動補零。
3. 爆破字典生成:實用場景
花括號擴展在生成爆破字典(如密碼、文件名)時尤為高效。
3.1 多位組合
固定模式:
echo {a..z}{A..Z}{0..9}
- 輸出:
aA0 aA1 ... zZ9
- 總項數:26 × 26 × 10 = 6760。
全字符集:
echo {{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}{{a..z},{A..Z},{0..9}}
- 輸出:
aaa aab ... 999
- 總項數:623 = 238,328。
3.2 年份字典
echo {2020..2025}
- 輸出:
2020 2021 2022 2023 2024 2025
- 用途:生成時間相關的測試數據。
3.3 美化輸出
換行顯示:
echo {a..c}{0..2} | tr ' ' '\n'
- 輸出:
a0 a1 a2 b0 b1 b2 c0 c1 c2
3.4 動態生成 N 位字典
N=3
cmd="echo "
for ((i=1; i<=N; i++)); docmd="$cmd{{a..z},{A..Z},{0..9}}"
done
eval "$cmd" > dict.txt
- 輸出:3 位全字符組合,保存至
dict.txt
。
4. 高級技巧:腳本與文件操作
4.1 批量文件操作
touch file{1..3}.txt
- 效果:創建
file1.txt file2.txt file3.txt
。
4.2 管道與參數處理
echo {a..c}{0..1} | xargs -n 1 echo "Test:"
- 輸出:
Test: a0 Test: a1 Test: a2 Test: b0 ...
4.3 條件過濾
結合 grep
篩選:
echo {a..z}{0..9} | grep -E '^[aeiou]'
- 輸出:
a0 a1 ... u9
- 用途:提取特定模式。
4.4 嵌套目錄結構
mkdir -p dir{1..2}/sub{1..2}
- 效果:創建
dir1/sub1 dir1/sub2 dir2/sub1 dir2/sub2
。
5. 注意事項與限制
- 語法限制:
{a..z,A..Z,0..9}
無效,需用{{a..z},{A..Z},{0..9}}
。
- 內存限制:
- 大范圍(如
{1..1000000}
)可能耗盡內存,建議用seq 1 1000000
。
- 大范圍(如
- 變量嵌入:
{1..$n}
需配合eval
:n=5; eval echo {1..$n}
6. 完整爆破字典腳本示例
#!/bin/bash
N=3
TEMPLATE="Testing ???\r"
cmd="echo "
for ((i=1; i<=N; i++)); docmd="$cmd{{a..z},{A..Z},{0..9}}"
done
eval "$cmd" | while read line; doecho "$TEMPLATE" | awk -v a="$line" '{gsub(/\?\?\?/, a)}1' | tr -d '\n'echo "$line" >> dict.txt
done
echo -e "\nDone!"
- 功能:生成 3 位組合,顯示進度并保存至
dict.txt
。 - 輸出示例:
Testing aaa
到Testing 999
。
7. 與其他工具對比
7.1 Crunch
crunch 3 3 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -o dict.txt
- 優勢:
- 高效處理大規模字典,內存占用優化。
- 支持復雜模式(如固定字符、模板)。
- 可直接輸出到文件,避免管道開銷。
- 劣勢:
- 非 Bash 內置,需安裝。
- 配置稍復雜,學習曲線略高。
- 適用場景:生成超大爆破字典(如密碼破解)。
7.2 Bash {start…end}
echo {a..z}{A..Z}{0..9} > dict.txt
- 優勢:
- Bash 內置,無需額外依賴,開箱即用。
- 語法簡潔,適合快速生成中小規模序列或組合。
- 與管道和腳本無縫集成。
- 劣勢:
- 內存受限,大范圍擴展(如
{1..1000000}
)可能導致崩潰。 - 不支持復雜模式或動態模板。
- 內存受限,大范圍擴展(如
- 適用場景:臨時生成小規模數據、腳本中的快速迭代。
7.3 seq
seq 1 2 10
- 功能:生成數字序列,支持步長。
- 輸出示例:
1 3 5 7 9
(步長為 2)。 - 優勢:
- 專為數字序列設計,性能優于
{start..end}
。 - 支持浮點數(如
seq 1 0.5 3
輸出1 1.5 2 2.5 3
)。 - 內存占用低,適合超大范圍。
- 專為數字序列設計,性能優于
- 劣勢:
- 僅限數字,不支持字母或組合。
- 需要配合其他工具實現復雜功能。
- 適用場景:生成大范圍數字序列(如循環計數、文件名編號)。
- 用法示例:
for i in $(seq 1 1000000); do echo "file$i.txt"; done
對比總結
工具 | 內置性 | 支持類型 | 內存效率 | 復雜模式 | 適用規模 |
---|---|---|---|---|---|
{start..end} | 是 | 數字、字母、組合 | 低 | 否 | 小中規模 |
seq | 是 | 數字 | 高 | 否 | 大規模 |
crunch | 否 | 數字、字母、組合 | 高 | 是 | 超大規模 |
結語
Bash 花括號擴展 {start..end}
語法簡單卻功能強大,掌握其基礎與進階用法,能極大提升腳本效率。無論是生成測試數據、批量操作文件,還是創建爆破字典,它都是不可或缺的利器。結合管道和其他工具,您可以解鎖更多可能性!