숫자 범위를 반환하는 표준 유닉스 프로그램이 있습니까?


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

그런 것이 존재합니까, 아니면 직접 작성해야합니까?


"유닉스"라고 말할 때 정말로 리눅스를 의미합니까? 아니면 다른 시스템 (Solaris, BSD 등)으로의 이식성에 정말로 관심이 있습니까?
glenn jackman

2
S / 범위 / 서열 - 교체 range와 함께 seq귀하의 예이다. 기본 구분 기호는 개행 문자이며 공백이 있습니다.seq -s " " 10 20
n611x007

@naxa forIFS를 다르게 설정하지 않는 한 공백이나 줄 바꿈인지 여부는 루프 또는 인수를 분할하는 일반 명령 에서 중요하지 않습니다 .
slhck

1
이 질문은 "표준 유닉스 프로그램"이 OP에 의미하는 바를 정의해야합니다.
David Rivers

1
@DavidRivers가 이미 언급했듯이 제목과 Linux 배포에 중점을 둔 질문을 언급해야합니다. 당신이 받아 들인 대답은 표준 유닉스 프로그램이 아닌 도구를 제안합니다. seqPOSIX에 의해 지정되지 않은 여러 유닉스가 부족 합니다.
jlliagre 2016 년

답변:


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했습니까?
Carlos Campderrós

@ CarlosCampderrós 물론 안타깝게도 더 이상 내 의견을 편집 할 수 없습니다.
scai

3
seq 10 20추가 할 가치가있는 간단한 예일 수도 있습니다.)
Der Hochstapler

@scai 굉장합니다, 나는 오늘 새로운 것을 배웠습니다 :) 솔직히 말해서, 당신은 그것을 별도의 더 자세한 답변으로 추가해야한다고 생각합니다!
Tim Groeneveld

33

배 쉬면 충분할까요?

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

중괄호 확장 으로 많은 작업을 수행 할 수 있습니다 . Bash 4는 또한 예를 들어 패딩 범위를 지원합니다 {01..20}.

강타는 유의 하지 표준 유닉스 유틸리티 휴대용 간주하지. 대부분의 최신 Linux에 설치되었다고 가정 할 수 있지만 모든 종류의 Unix 계열 컴퓨터에서 실행하려는 스크립트에는 사용하지 마십시오.


13
@ Maksim :이 중괄호 확장도 선호하지만 그에 대한 일반적인 Un * x 도구도 있습니다 (매우 적지 만 잘 수행하십시오) seq. 사용법은 예제와 같습니다 seq -s " " 10 20.. -s디폴트 값에 의해 구분되기 때문에 변수가 필요하다 \n.
mpy

예, Bash는 얼마나 엄격한 해석에 따라 "표준"이 아닙니다. 처리하기가 더 쉬우 며 추가 전화가 필요하지 않습니다.
slhck

1
@mpy, seqGNU 유틸리티이므로 "표준 유닉스 프로그램"이 아닙니다.
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의 계획 9와 GNU 핵심 유틸리티에서 같은 이름의 명령을 기반으로합니다. GNU seq 명령은 1.13 쉘 유틸리티 릴리스에서 처음 나타났습니다. "
200_success

또한 할 수 for i in {001..010}; ... ; done있으며 숫자를 3 자리로 0으로 채 웁니다.
VolatileDream

9

포터블 한 것을 원한다면 (즉, POSIX에서 지정하지 않은 특정 bash 확장 또는 명령에 의존하지 않는)

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

1
추가 /dev/null하거나 추가 할 필요 < /dev/null가 없습니까?
Scott

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 이전 에는 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

완전성을 위해 여기에서 펄이 설치되어있는 한 유닉스의 일부 오래된 변종과 작동하는 것이 있습니다. 정말 우아하지 않습니다.

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.