如何制作一个以五为单位计数的脚本?

如何制作一个以五为单位计数的脚本?

我试图制作一个非常简单的 bash 脚本来列出 375 到 3500 之间的所有 5 的倍数(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

如何在 bash 脚本中编写 BASIC 程序?

答案1

既然你无论如何都使用大括号扩展,所以充分利用它的功能:

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 作为默认 shell,它不支持大括号扩展的序列表达式中的增量。您需要升级到 bash 版本 4 或使用其他支持该版本的 shell(例如最近的 zsh)。

答案2

或者可以使用传统的 C 风格的 for 循环:

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

这可能比使用 seq 不太清楚,但它不会产生任何子进程。虽然由于我熟悉 C,所以理解这一点不会有任何困难,但是 YMMV。

答案3

使用 SEQ(1)

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

或者,简单地说:

seq 375 5 3500

答案4

当然,虽然有一个应用程序可以实现此目的 ( 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}}'

相关内容