数値の範囲を返す標準のUNIXプログラムはありますか


22

時代遅れの教科書からシェルスクリプトを学んでいるので、スペースで区切られた数字の文字列を返すだけのプログラムがあると本当に便利だと思う

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

次に、シェルスクリプトを実行している場合は、

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 forIFSの設定が異なる場合を除き、ループでもスペースでも改行でも、引数を分割する一般的なコマンドでも問題ありません。
-slhck

1
この質問は、OPに対する「標準のUNIXプログラム」の意味を定義する必要があります。
デビッドリバーズ

1
@DavidRiversがすでにコメントしているので、タイトルと、Linuxディストリビューションに焦点を当てる質問に明記する必要があります。あなたが受け入れた答えは、標準のUnixプログラムではないツールを示唆しています。seqPOSIXで指定されていないため、いくつかのUnixが欠けています。
jlliagre

回答:


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もちろん、残念ながらこれ以上コメントを編集することはできません。
scai

3
seq 10 20また、追加する価値のある簡単な例かもしれません;)
デアホッホスタプラー

素晴らしい@scai、今日新しいことを学びました:)正直に言うと、それを別のより詳細な答えとして追加すべきだと思います!
ティムグルーネフェルド

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ので、「標準UNIXプログラム」ではないGNUユーティリティです、そして
グレン・ジャックマン

5
@glennjackmanによるとdeveloper.apple.com/library/Mac/documentation/Darwin/Reference/... ...「最初のベル研究所からプラン9に登場した。Aの配列コマンドは、FreeBSD 9.0にはNetBSD 3.0で登場し、移植された配列コマンドこのコマンドは、Bell LabsのPlan 9の同名のコマンドとGNUコアユーティリティに基づいていました。GNUseqコマンドは、1.13シェルユーティリティリリースで初めて登場しました。」
200_success

また、実行できることに注意してくださいfor i in {001..010}; ... ; done。3桁になるまで数字がゼロで埋められます。
VolatileDream

9

厳密に移植可能なものが必要な場合(つまり、POSIXで指定されていない特定のbash拡張機能やコマンドに依存しない)

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

6

10.7より前seqはMac OS X にはありませんでしたがjot、BSDの遺産のために。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.