是否有一个标准的 unix 程序可以返回一个数字范围

MYV*_*MYV 23 unix bash

我从一本过时的教科书中学习 shell 脚本,在我看来,拥有一个只返回一串由空格分隔的数字的程序真的很有用,比如

$ range 10 20
10 11 12 13 14 15 16 17 18 19 20
Run Code Online (Sandbox Code Playgroud)

然后,如果你在做一个 shell 脚本,你可以有

for i in `range 10 20`; do some stuff with numbers in that range;done
Run Code Online (Sandbox Code Playgroud)

这种东西存在吗,还是我需要自己写?

cho*_*oba 80

seq 是 coreutils 的一部分。

for i in $( seq 1 2 11 ) ; do echo $i ; done
Run Code Online (Sandbox Code Playgroud)

输出:

1
3
5
7
9
11
Run Code Online (Sandbox Code Playgroud)

如果只向 提供 2 个参数seq,则增量为 1:

$ seq 4 9
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

  • `seq 10 20` 也可能是一个值得添加的简单示例;) (3认同)
  • `sed` 也有很好的选项,比如 `-s` 来设置分隔符或 `-w` 来限定宽度。您可以提供一个增量:`seq -w -s ", " 0 5 20` 结果为 *00, 05, 10, 15, 20*。 (2认同)
  • @scai 你的意思是`seq`? (2认同)

slh*_*hck 34

Bash 就够了吗?

for i in {10..20}; do echo $i; done
Run Code Online (Sandbox Code Playgroud)

你可以用大括号扩展做很多事情。Bash 4 还支持填充范围,例如{01..20}.

请注意,Bash被认为是可移植的,也不是标准的 Unix 实用程序。尽管您可以安全地假设它已安装在大多数现代 Linux 上,但不要在您计划在各种类 Unix 机器上运行的脚本中使用它。

  • @Maksim:虽然我也更喜欢这种大括号扩展,但还有一个典型的 Un*x 工具(做得很少,但做得很好):`seq`。用法如您的示例所示:`seq -s " " 10 20`。`-s` 参数是必需的,因为默认情况下这些值由 `\n` 分隔。 (13认同)
  • @glennjackman 根据 http://developer.apple.com/library/Mac/documentation/Darwin/Reference/ManPages/man1/seq.1.html...“seq 命令首次出现在贝尔实验室的计划 9 中。A seq 命令出现在 NetBSD 3.0 中,并移植到 FreeBSD 9.0。该命令基于来自贝尔实验室的 Plan 9 中的同名命令和 GNU 核心实用程序。GNU seq 命令首次出现在 1.13 shell 实用程序版本中。” (5认同)

jll*_*gre 9

如果你想要一些严格可移植的东西(即不依赖于 POSIX 未指定的特定 bash 扩展或命令)

awk 'BEGIN {for(i=10;i<=20;i++) printf "%d ",i; print}'
Run Code Online (Sandbox Code Playgroud)


mik*_*iku 6

在 10.7 之前seq,Mac OS X 上没有,但是jot由于 BSD 传统。

jot -- print sequential or random data

...

HISTORY
    The jot utility first appeared in 4.2BSD
Run Code Online (Sandbox Code Playgroud)

例子:

$ jot - 1 3
1
2
3
Run Code Online (Sandbox Code Playgroud)