善用 Bash 大括号展开
Linux and Bash
Bash的展开有好几种,最常用的是大括号展开(Brace Expansion),写脚本时能让结构清爽不少。
大括号展开分两种形式:列举(逗号,分隔)和序列(双点号..分隔),序列还支持步长参数。数字以0开头(比如01),输出会按最大宽度补零对齐。
大括号展开可以拼接、可以嵌套,跟字面量混着用,任意路径都拼得出来。Bash 执行命令前会先完成展开,所以拿它批量生成参数,一条命令传给程序,省得写多条。
序列的零填充
数字以0开头时,Bash 会自动按最大宽度补零对齐:
echo {01..12}
# 输出:01 02 03 04 05 06 07 08 09 10 11 12
echo {001..005}
# 输出:001 002 003 004 005
最大宽度由序列中最大数字的位数决定。
典型场景
同时创建多个文件:
touch /path/to/dir{1,3,5,7,9}/file.txt
touch /path/to/dir{1..9..2}/file.txt # 同上
touch /path/to/dir/0x{A..Z}.txt
同时删多个文件:
rm -f /var/logs/nginx/access.log.{1..5}
同目录备份配置文件:
cp /etc/nginx/nginx.conf{,.bak}
循环控制(10 遍):
for s in {0..9}
do
echo $s
done
循环控制(100 遍):
for s in {0..99}
do
echo $s
done
循环控制(16 遍)/ 虚拟十六进制:
for s in {{0..9},{A..F}}
do
echo $s
done
循环控制(256 遍)/ 虚拟十六进制:
for s in {{0..9},{A..F}}{{0..9},{A..F}}
do
echo $s
done
其余展开类型(按优先级排列)
- 大括号展开(Brace Expansion)
{...} - 波浪号展开(Tilde Expansion)
~ - 参数展开(Shell Parameter Expansion)
${...} - 命令替换(Command Substitution)
$(...)或`...` - 数学计算(Arithmetic Expansion)
$((..)) - 进程替换(Process Substitution)
<(...)或>(...) - 单词分割(Word Splitting)
IFS - 文件名展开(Filename Expansion)
*?[..] - 引号去除(Quote Removal)