Shell 里要生成一串连续数字——批量建文件、写循环、造测试数据——seq 就是为这而生的:给定首数、增量、尾数,它把落在序列上的整数逐行打印出来。这篇按基本形式、常用选项、实战用法三类整理,末尾附速查表,完整参数可查 GNU coreutils 的 seq 文档。
1、三种基本形式
seq 接受 1 个、2 个或 3 个数字参数,三种形式如下:
seq 5 # 输出 1~5,首数默认 1,增量默认 1
seq 5 10 # 输出 5~10,含首尾边界
seq 1 2 10 # 输出 1 3 5 7 9,增量为 2
三种形式的输出依次如下:
1 2 3 4 5
5 6 7 8 9 10
1 3 5 7 9
第三种形式有个易错点值得单独记:只输出落在"首数 + k × 增量"上且不超过尾数的值。seq 1 2 10 不含 10,因为 10 不在步进序列上,下一个候选 11 又超出边界——增量不整除区间时,尾数是"天花板"不是"必达项"。
2、三个常用选项
2.1、指定分隔符
-s 改变数字之间的分隔符,默认是换行:
seq -s '#' 1 2 10
输出为一行 1#3#5#7#9。想要单行序列喂给下游命令时最常用,比如拼逗号分隔的 ID 列表用 -s ','。
2.2、等宽补零
-w 让所有数字同宽,不足的左侧补零:
seq -s ' ' -w 1 2 10
输出为 01 03 05 07 09。注意宽度基准是尾数的位数——本例 10 虽然不会被打印,但两位数的宽度已经被用来补零了。批量生成 file01.txt 这类文件名时正好用上。
2.3、格式化输出
-f 使用 printf 风格的浮点格式,%g 占位实际数字:
seq -f 'str%5g' 1 5
输出为五行的 str 加右对齐数字,%5g 表示宽度 5、不足左侧补空格。相比 -w 只能补零,-f 可以嵌入任意前后缀并控制对齐,是三个选项里最灵活的。
3、实战用法与花括号对比
最高频的场景是驱动 for 循环,比如批量创建 20 个带编号的文件:
for i in $(seq -f 'file%02g' 1 20); do touch "$i.txt"; done
%02g 补零到两位,生成 file01.txt 到 file20.txt。倒序也支持,增量为负即可:seq 10 -1 1 输出 10 到 1。
Bash 内建的花括号展开 {1..10} 也能生成序列,且不 fork 子进程、更快,纯字面量场景优先用它。seq 的不可替代之处在于边界可以是变量——seq $start $end 正常工作,而 { $start..$end } 不会展开变量,循环边界来自参数或计算结果时只能用 seq。
4、速查表
常用形式与选项浓缩一张表:
| 场景 | 命令 |
|---|---|
| 1 到 n | seq 5 |
| 指定区间 | seq 5 10 |
| 指定增量 | seq 1 2 10 |
| 倒序 | seq 10 -1 1 |
| 自定义分隔符 | seq -s ',' 1 10 |
| 等宽补零 | seq -w 1 20 |
| 格式化输出 | seq -f 'file%02g' 1 20 |
| 变量边界循环 | seq $start $end |
5、总结
seq 的用法一句话概括:三种参数形式(尾数、首尾、首增量尾)决定序列本身,三个选项(-s 分隔、-w 补零、-f 格式化)决定输出长相。两个关键认知——增量不整除时尾数是天花板不是必达项;字面量序列用 {1..10} 更快,变量边界只能靠 seq。对于写 Shell 脚本的人,建议把速查表存进备忘录,与 Git 系列速查放在一起,更多 Linux 命令可查 Linux 命令大全,手册原文见 man seq。

