5로 계산할 스크립트를 만들려면 어떻게해야합니까?


10

375에서 3500 사이의 5의 배수를 모두 나열하기 위해 매우 간단한 bash 스크립트를 만들려고했습니다 (375, 380, 385 ...). 내가 시도했지만 작동하지 않은 한 가지는 :

for i in {375..3500}
do
        echo $i
        (($i += 5))
done

나는 잠시 후에 포기하고 약 15 초 안에 이것을 BASIC에 썼습니다 :

10 count = 375
20 print count
30 count = count+5
40 if count < 3500 then goto 20

BASIC 프로그램을 bash 스크립트로 만들려면 어떻게해야합니까?


이것은 스택 오버플로에서 더 좋습니다. Unix & Linux는 코딩이 아닌 OS에 관한 것입니다. 코딩은 스택 오버 플로우를위한 것입니다.
noɥʇʎԀʎzɐɹƆ

답변:


20

또는 전통적인 C 스타일 for 루프를 사용할 수 있습니다.

for ((i=375; i<=3500; i+=5)); do
    echo $i
done

이것은 seq를 사용하는 것보다 명확하지 않지만 하위 프로세스를 생성하지 않습니다. C에 익숙하기 때문에 이것을 이해하는 데 어려움이 없지만 YMMV입니다.


1
이 방법의 단점은 이식성이 떨어 졌다는 것입니다. seq 메소드는 POSIX sh에서 작동합니다.
Wouter Verhelst

POSIX sh에는 C 스타일 for 루프가 존재하지 않습니까? 매일 새로운 것을 배우고 있습니다.
Muzer

2
@WouterVerhelst POSIX sh로 제한되는 경우를 제외하고는 GNU coreutils의 일부인 seq가 없을 것입니다. busybox는 구현이 더 제한적이지만 그 외에는 많은 임베디드 시스템이 전혀 없을 것입니다.
Chris Down

1
@Muzer-적어도 dash지원하지 않습니다. @ChrisDown- "POSIX sh" "seq 없음"을 의미하는 이유 없습니다. 그러나 그래, 나는 seq가 POSIX에 의해 지정되지 않았다는 사실을 간과했다.
Wouter Verhelst

27

어쨌든 중괄호 확장을 사용하므로 해당 기능을 완전히 활용하십시오.

echo {375..3500..5}

이 기법을 사용하여 다음과 같이 printf대신에 옵션 텍스트를 사용하여 각 번호를 별도의 줄에 인쇄 할 수도 있습니다 echo.

$ printf "Number %s is generated.\n" {375..3500..5}
Number 375 is generated.
Number 380 is generated.
Number 385 is generated.
...

편집하다

주석에서 @kojiro가 지적한 것처럼 Mac OS는 bash 3을 기본 쉘로 사용하며 중괄호 확장의 시퀀스 표현 증분을 지원하지 않습니다. bash 버전 4로 업그레이드하거나이를 지원하는 다른 쉘 (예 : 최근 zsh)을 사용해야합니다.


2
Mac OS 10.10.3에서는 작동하지 않습니다. '{375..3500..5}'를 출력합니다.
aswine

6
@aswine이므로 물어볼 때 항상 OS를 언급해야합니다. 특히 OSX는 다른 유니 세 및 Linux와 많은 차이가 있기 때문입니다.
terdon

2
이것은 OS의 차이가 아닙니다. 버전 차이입니다. OS X에는 BASH 3 OOTB 만 있습니다. 거의 모든 OS X 패키지 관리자를 사용하여 금세기부터 BASH를 설치할 수 있습니다. 나는 홈 브루를 사용합니다.
kojiro

2
확장이 직접 실패하지만 성공한다는 사실은 bash -c두 개의 다른 쉘이 포함되어 있음을 보장합니다. $SHELL --versionbash 3이라고 말 합니까 ?
dhag

3
@ mikeserv 대답은 매우 간단 bash합니다.이 기능 의 어떤 버전 이 도입 되었는지 전혀 몰랐기 때문에 글을 쓰지 않았습니다 . 나는 kojiro의 의견에서 그것을 스스로 배웠다. 그리고 SC와 저를 비교하지 마십시오. 나는 1970 년 후반부터 모든 포탄의 세부 사항과 역사를 전혀 모릅니다. 다시 한번-당신이 그것을 기대한다면, 그냥 투표하십시오.
jimmij

17

SEQ (1) 사용

for i in $(seq 375 5 3500)
do
    echo $i
done

또는 간단히 :

seq 375 5 3500

4
루프를 삭제하고 그냥 사용하는 것이 더 간단합니다 seq 375 5 3500.
dhag

11

두 가지 이유로 필요한 for-loop 스 니펫이 작동하지 않았습니다.

  • (($i += 5))-여기서 $i값이 확장됩니다 i. 따라서 확장은 ((375 += 5))말이되지 않는 다른 리터럴 숫자에 리터럴 숫자를 할당하려고하는 것과 같습니다 . 이것은 일반적으로 ((i += 5))( $변수를 확장 하지 않음) 으로 달성됩니다.
  • {375..3500}루프의 첫 번째 반복 전에 확장됩니다. 숫자 목록이됩니다 375 376 ... 3499 3500. 루프가 반복 i될 때마다 각 번호에 하나씩 할당됩니다. 따라서 각 반복이 시작될 때 i1의 단계로 계산되어 목록의 다음 값으로 재 할당됩니다. ((i += 5))효과적으로 아무 것도 수행 하지 않습니다-5를 i에 추가하지만 i는 처음에 다시 할당됩니다. 다음 반복.

나는 for (( ; ; ))대답을 가장 좋아한다고 생각 하지만 여기에 당신이 생각하게하는 몇 가지 대안이 있습니다.


우리는 5의 배수를 다루고 있으며 {a..b..i}확장은 bash 버전 3.2.57 (1) (OS X에서)에서 지원되지 않기 때문에 대신이 약간 이상한 일을 할 수 있습니다.

for i in 375 {38..349}{0,5} 3500; do
    echo $i
done

이것은 bash를 사용하여 직교 곱을 만드는 방법을 보여줍니다.


필자는 일반적으로 for 루프가 가장 편리한 방법이라고 생각하지만 관심이 있다면 while 루프 (BASIC에 조금 더 가까운) 프로그램을 사용할 수 있습니다.

count=375
while (( count <= 3500 )); do
    echo $count
    (( count += 5 ))
done

1
@ jimmij ... 데카르트 제품은 무엇입니까? 당신이 원하는 경우 당신은 의견을 downvote 수 있으며, 심지어 당신이 말해도 상관하지 않습니다. 궁금해.
mikeserv

1
@mikeserv 당신은 의견을 downvote 수 없습니다 : en.wikipedia.org/wiki/Cartesian_product
jimmij

@ jimmij-당신 이해도 여전히 괜찮습니다.
mikeserv

@jimmij 악마에 대해 이야기하고 있습니까? 카티 전 곱은 두 세트 (동일 세트 일 수도 있고 아닐 수도 있음)에서 가능한 모든 요소 조합의 튜플 세트입니다. 더 구어체 적으로, 그것은 단지 두 가지 그룹의 "가능한 모든 조합"입니다. 한 세트 만 보입니다. 여기에 데카르트 제품이 있습니까?
jpmc26

1
@ jpmc26 맞습니다. "가능한 모든 조합"이므로 두 축을 플로팅하여 먼저 38까지 모든 숫자를 씁니다 349. 두 번째에는 두 개의 숫자 만 있습니다 : 05. 이제 그 모든 조합의 순서쌍을 만들 수 있습니다 - 당신이 세트로 쓸 수 있습니다 : {38,0}, {38,5}... {349,5}, 아니면 그냥 중복 문자 제거 {, ,그리고 }얻을 ... 새 번호를 380... 3495.
jimmij

5

물론 ( seq 375 5 3500) 용 앱 이 있지만 명령 줄에서이를 수행하는 다양한 방법이 있습니다. 가장 빠르고 간단한 방법은을 사용하는 반면 seq다른 옵션은 다음과 같습니다.

for i in {375..3500}; do [[ (($i % 5)) -eq 0 ]] && echo $i; done

i=370; while [ $i -le 3500 ]; do printf "%s\n" $((i+=5)); done

perl -le '$i=shift;while($i<=$ARGV[0]){print $i; $i+=5; }' 375 3500
perl -le 'map{print $_ + 5} 370..3495'

awk 'BEGIN{ for(i=375;i<=3500;i+=5){print i}}'

Nit pick : $(($i % 5))쓸 수 있습니다 $((i % 5)).
G-Man, 'Reinstate Monica'라고

4

POSIXly :

i=370
while [ 3500 -gt "$i" ]
do    echo "$((i+=5))"
done

...또는...

echo 'for(x=370;x<=3500;x+=5)x' |bc

나는 당신이 다른 방법으로 그것을하는 이유를 모르겠습니다. 물론 ...

seq 375 5 3500

... 나에 dc:

echo '370[5+pd3500>p]splpx'|dc

dc코드 가 어떻게 작동 하는지 궁금 합니다. 를 사용하는 것보다 확실히 더 흥미 롭습니다 seq.
dhag

1
@ dhag-작은 루프를 씁니다. 그것은 sAVES [문자열 ]의 위로 p그리고, 어레이 l스택 및 전자의 상단에 다시 oads x매크로로 ecutes 그것을. 매크로 내에서 우리 5는 스택을 밀고 그다음에 두 번째와 +그 위에서 p튀어 나와 두 스택 값을 합계로 대체합니다.이 스택 은 스택에서 푸시 d되기 전에 헹구고 겹쳐 3500집니다. 비교 >. 3500더 큰 경우 p배열에 저장된 문자열 (현재 매크로) 또는 중단되지 않은 경우 매크로 로로드하고 실행 합니다.
mikeserv

3

배쉬 3에 갇혀 있다면 :

echo {375..3500} | tr ' ' '\n' | sed -n 'p;n;n;n;n'

원하는 경우 awk:

echo {375..3500} | tr ' ' '\n' | awk '!((NR-1)%5)'

나는 중괄호 확장에 대해 몰랐습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.