seq 是 Linux 下轻量高效的数字序列生成命令,支持三参数控制起止步长、格式化输出及 locale 安全用法,适用于脚本参数构造与测试数据生成。

seq 是 Linux 下最轻量、最直接生成数字序列的命令,不用写循环、不依赖 bash 扩展,只要 shell 有 POSIX 兼容性就能用。它不是“可有可无的玩具”,而是脚本里批量构造参数、生成测试数据、配合 for 或 xargs 的高频工具。
基础用法:三个参数控制起止步长
多数人只记得 seq 1 5,但真正灵活的是三参数形式:seq START STEP END。省略 STEP 时默认为 1;START 省略则从 1 开始。
-
seq 1 2 10→ 1 3 5 7 9(含起点,不含超过终点的值) -
seq 5→ 1 2 3 4 5(只给一个数,当作END) -
seq 3 1→ 空输出(因为默认步长 +1,3 到 1 不可能递增);要倒序得显式写负步长:seq 3 -1 1
格式化输出:避免空格干扰脚本处理
默认每行一个数字,但如果用于拼接文件名或传给 curl,你可能需要一行、带前导零、或用其他分隔符——这时不能靠管道再 tr,而要用 -f 和 -s。
-
seq -f "%03g" 1 5→001002003004005(%03g表示至少 3 位,不补零用%g) -
seq -s "," 1 3→1,2,3(注意:结尾无逗号) -
seq -f "file_%02g.txt" -s " " 1 3→file_01.txt file_02.txt file_03.txt(一步生成带格式的空格分隔字符串)
常见陷阱:浮点数、大数溢出与 locale 干扰
seq 支持浮点步长(如 seq 0.1 0.3 1.0),但底层用 double 运算,会积累浮点误差。另外,某些 locale(比如德语环境)会让小数点变成逗号,导致解析失败。
- 执行前加
LC_ALL=C避免 locale 问题:LC_ALL=C seq 0.1 0.3 1.0 - 不要用
seq做高精度浮点计数,比如生成 0.001 步长到 1000 —— 误差可能累积到跳过某些值 - 超大整数(如
seq 1 1 1000000000)在内存受限机器上可能卡住或被 kill,此时应考虑用awk 'BEGIN{for(i=1;i 流式输出
替代方案对比:什么时候不该用 seq
当你要嵌入复杂逻辑(比如跳过某类数字)、或需与其他命令深度耦合时,seq 就显得僵硬。它本质是“生成器”,不是“计算器”。
- 需要条件过滤?用
awk:awk 'BEGIN{for(i=1;i - 要在循环中实时计算?直接用
bash的for ((i=1;i 更可控 - 跨平台兼容性要求高(比如 macOS)?原生
seq在 BSD 上行为略有差异(如不支持-f),优先用gseq(coreutils)或改用perl -e 'print "$_\n" for @ARGV' {1..10}
真正麻烦的不是记不住参数,而是忘记 LC_ALL=C 导致脚本在不同服务器上行为不一致,或者误把 seq 当万能计数器去处理浮点边界场景。


















