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)