Gibt es ein Standard-Unix-Programm, das einen Zahlenbereich zurückgibt?


22

Ich lerne Shellskripting aus einem veralteten Lehrbuch und es scheint mir wirklich nützlich zu sein, ein Programm zu haben, das nur eine Folge von Zahlen zurückgibt, die durch Leerzeichen wie begrenzt sind

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

Dann, wenn Sie ein Shell-Skript machen, können Sie haben

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

gibt es so etwas oder muss ich es selbst schreiben?


Wenn Sie "Unix" sagen, meinen Sie wirklich Linux? Oder interessieren Sie sich wirklich für die Portabilität auf andere Systeme (Solaris, BSD, ...)?
Glenn Jackman

2
s / Bereichs- / f - ersetzen rangemit seqin Ihrem Beispiel. Das Standardtrennzeichen ist newline, um Leerzeichen zu haben:seq -s " " 10 20
n611x007

@naxa Ob es sich um Leerzeichen oder Zeilenumbrüche handelt, spielt in der forSchleife keine Rolle - oder auch nur einen allgemeinen Befehl, der Argumente aufteilt - es sei denn, Sie haben das IFS anders festgelegt.
Slhck

1
Diese Frage sollte definieren, was "Standard-Unix-Programm" für OP bedeutet.
David Rivers

1
Wie @DavidRivers bereits kommentiert hat, sollten Sie im Titel angeben, auf welche Linux-Distributionen Sie sich konzentrieren. Die von Ihnen akzeptierte Antwort schlägt ein Tool vor, das KEIN Standard-Unix-Programm ist. Es fehlen einige Unix-Versionen, seqda diese von POSIX nicht spezifiziert werden.
Juli

Antworten:


79

seq ist ein Teil von coreutils.

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

Ausgabe:

1
3
5
7
9
11

Wenn Sie nur 2 Argumente für seqangeben, ist das Inkrement 1:

$ seq 4 9
4
5
6
7
8
9

2
sedhat auch nette optionen wie -sdas separator zu setzen oder -wdie breite zu qualifizieren. Und Sie können ein Inkrement angeben: seq -w -s ", " 0 5 20Ergebnisse in 00, 05, 10, 15, 20 .
SCAI

2
@scai meintest du seq?
Carlos Campderrós

@ CarlosCampderrós Natürlich kann ich meinen Kommentar leider nicht mehr bearbeiten.
Scai

3
seq 10 20könnte auch ein einfaches Beispiel sein, das es wert ist, hinzugefügt zu werden;)
Der Hochstapler

@scai das ist genial, ich habe heute etwas neues gelernt :) ehrlich gesagt, ich denke du solltest das als separate, detailliertere Antwort hinzufügen!
Tim Groeneveld

33

Würde Bash ausreichen?

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

Sie können eine Menge Dinge mit tun Klammer Expansion . Bash 4 unterstützt auch gepolsterte Bereiche, z {01..20}.

Beachten Sie, dass Bash nicht als portabel und nicht als Standard-Unix-Dienstprogramm gilt. Obwohl Sie davon ausgehen können, dass es auf den meisten modernen Linux-Systemen installiert ist, sollten Sie dies nicht in einem Skript verwenden, das auf allen Arten von Unix-ähnlichen Computern ausgeführt werden soll.


13
@Maksim: Obwohl ich diese Klammer Expansion auch bevorzugen, gibt es auch ein typisches Un * x - Werkzeug (sehr wenig tun, aber das auch tun) dafür: seq. Die Nutzung ist wie in Ihrem Beispiel: seq -s " " 10 20. Der -sParameter ist erforderlich, da die Werte standardmäßig durch getrennt sind \n.
mpy

Ja, Bash ist kein "Standard", abhängig davon, wie streng Sie das interpretieren. Ich finde es einfach einfacher zu handhaben und es erfordert keinen zusätzlichen Anruf.
Slhck

1
@mpy, beachte, dass seqes sich um ein GNU-Dienstprogramm handelt und daher kein "Standard-Unix-Programm" ist
Glenn Jackman

5
@glennjackman Laut developer.apple.com/library/Mac/documentation/Darwin/Reference/… ... "Der Befehl seq erschien zuerst in Plan 9 von Bell Labs. Ein Befehl seq erschien in NetBSD 3.0 und wurde auf FreeBSD 9.0 portiert Dieser Befehl basierte auf dem gleichnamigen Befehl in Plan 9 von Bell Labs und den GNU-Kerndienstprogrammen. Der Befehl GNU seq erschien erstmals in der Version 1.13 der Shell-Dienstprogramme. "
200_erfolg

Beachten Sie auch, dass Sie dies tun können for i in {001..010}; ... ; doneund die Zahl auf 3 Stellen aufnullen.
VolatileDream

9

Wenn Sie etwas strikt portierbares wollen (dh das nicht auf bestimmten Bash-Erweiterungen oder Befehlen basiert, die nicht von POSIX angegeben wurden)

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

1
Sie nicht müssen Sie hinzufügen /dev/nulloder < /dev/nulldarauf?
Scott

1
@Scott Nein, das ist nicht nötig. Der POSIX-Standard ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) spezifiziert: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

Vor 10.7 gab es sequnter Mac OS X aber jotaufgrund des BSD-Erbes keine .

jot -- print sequential or random data

...

HISTORY
    The jot utility first appeared in 4.2BSD

Beispiel:

$ jot - 1 3
1
2
3

2

Verwenden Sie eine forSchleife

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

2

Sie können es verwenden seqoder wenn Sie es nicht haben, können Sie es selbst schreiben:

#!/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 ; }

Verwendung:

$ ./seq 3
1
2
3

Oder:

$ ./seq 3 7
3
4
5
6
7

1

Der Vollständigkeit halber hier etwas, das mit einigen älteren Unix-Varianten (sofern sie Perl installiert haben) funktioniert. Nicht wirklich elegant.

for I in $(perl -e 'print join("\n", 1..10)'); do something with $I; done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.