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
될 때마다 각 번호에 하나씩 할당됩니다. 따라서 각 반복이 시작될 때i
1의 단계로 계산되어 목록의 다음 값으로 재 할당됩니다.((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)'
나는 중괄호 확장에 대해 몰랐습니다.