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

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 스크립트로 만들려면 어떻게해야합니까?



답변

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

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

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


답변

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

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)을 사용해야합니다.


답변

SEQ (1) 사용

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

또는 간단히 :

seq 375 5 3500

답변

두 가지 이유로 필요한 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

답변

물론 ( 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}}'

답변

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

답변

배쉬 3에 갇혀 있다면 :

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

원하는 경우 awk:

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

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