是否有标准的UNIX程序返回一系列数字


22

我正在从过时的教科书中学习shell脚本,在我看来,拥有一个仅返回由空格分隔的数字字符串的程序似乎非常有用。

$ range 10 20
10 11 12 13 14 15 16 17 18 19 20

然后,如果您正在执行Shell脚本,则可以

for i in `range 10 20`; do some stuff with numbers in that range;done

这样的东西是否存在,还是我需要自己写?


当您说“ unix”时,您真的是说Linux吗?还是您真的对移植到其他系统(Solaris,BSD等)感兴趣?
格伦·杰克曼(

2
s / range / seq- 在您的示例中替换rangeseq。默认分隔符为换行符,并带有空格:seq -s " " 10 20
n611x007

@naxa无论是空格还是换行符,在for循环中甚至是任何用于拆分参数的常规命令都无关紧要,除非您对IFS进行了不同的设置。
slhck

1
这个问题应该定义“标准的Unix程序”对OP意味着什么。
大卫·里弗斯

1
正如@DavidRivers已经评论过的那样,您应该在标题中注明,重点是Linux发行版。您接受的答案表明该工具不是标准的Unix程序。seq由于POSIX未指定,因此缺少几个Unix 。
jlliagre 2013年

Answers:


79

seq 是coreutils的一部分。

for i in $( seq 1 2 11 ) ; do echo $i ; done

输出:

1
3
5
7
9
11

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

$ seq 4 9
4
5
6
7
8
9

2
sed也有不错的选择,例如-s设置分隔符或-w限定宽度。您可以提供一个增量:seq -w -s ", " 0 5 20结果为 00,05,10,15,20
scai

2
@scai你的意思是seq
卡洛斯·坎德罗斯(CarlosCampderrós)

@CarlosCampderrós当然,很遗憾,我无法再编辑我的评论。
scai

3
seq 10 20也可能是值得添加的简单示例;)
Der Hochstapler 2013年

@scai太棒了,老实说,我今天学到了一些新东西:)老实说,我认为您应该将其添加为一个单独的,更详细的答案!
Tim Groeneveld

33

Bash够了吗?

for i in {10..20}; do echo $i; done

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

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


13
@Maksim:虽然我也喜欢这种花括号扩展,还有一个典型的Un * X工具(很少做,但这样做很好)为:seq。用法与您的示例相同:seq -s " " 10 20。该-s参数是必需的,因为默认情况下,值用分隔\n
mpy

是的,Bash不是“标准”,具体取决于您对解释的严格程度。我只是觉得它更容易处理,不需要额外的电话。
slhck

1
@mpy,请注意,这seq是GNU实用程序,因此不是“标准的Unix程序”
glenn jackman

5
@glennjackman,根据developer.apple.com/library/Mac/documentation/Darwin/Reference/… ...“ seq命令首先出现在Bell Labs的Plan 9中。seq 命令出现在NetBSD 3.0中,并移植到FreeBSD 9.0该命令基于Bell Labs和GNU核心实用程序在Plan 9中的同名命令。GNUseq命令首先出现在1.13 shell实用程序版本中。”
200_success

另请注意,您可以执行此操作for i in {001..010}; ... ; done,它将数字零填充到3位数字。
VolatileDream

9

如果您想要某些可移植的东西(即不依赖特定的bash扩展名或POSIX未指定的命令)

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

1
您是否不需要添加/dev/null或添加< /dev/null
斯科特,

1
@Scott不,这不是必需的。POSIX标准(pubs.opengroup.org/onlinepubs/9699919799/utilities/…)指定:If the awk program contains no actions and no patterns, but is otherwise a valid awk program, standard input and any file operands shall not be read and awk shall exit with a return status of zero.
jlliagre 2013年

6

在10.7之前,由于BSD的原因,seqMac OS X上没有该功能,但是jot

jot -- print sequential or random data

...

HISTORY
    The jot utility first appeared in 4.2BSD

例:

$ jot - 1 3
1
2
3

2

使用for循环

for ((i = 10; i <= 20; ++i)); do
    printf '%d\n' "$i"
done

2

您可以使用seq,或者如果没有,可以自己编写:

#!/bin/bash
[ $# -ge 1 ] || { echo "Usage: seq Number [ Number ]" 1>&2 ; exit 1; }
[ $# -eq 1 ] && { [ $1 -gt 1 ] && ./seq $(($1 - 1)) ; echo $1 ; }
[ $# -eq 2 ] && { [ $(($2 - $1)) -gt 0 ] && ./seq $1 $(($2 - 1)) ; echo $2 ; }

用法:

$ ./seq 3
1
2
3

要么:

$ ./seq 3 7
3
4
5
6
7

1

为了完整起见,某些东西可以与某些较旧的Unix变体一起使用(只要安装了perl)。不太优雅。

for I in $(perl -e 'print join("\n", 1..10)'); do something with $I; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.