在sh脚本中计算模数

tis*_*was 17 sh modulo

我正在开发一个sh脚本,我在一个WHILE循环中,每次迭代变量都会增加,我想每五次迭代保存一个文件.

我通常做的(比如用C语言)就是做一个if ( n % 5 == 0)测试,但我不知道这是否可行......?如果不是,有没有人有任何想法可以完成工作?

干杯!

小智 40

如果你的sh真的是sh而不仅仅是bash以sh运行那么这将很好地工作

if [ `expr $n % 5` -eq 0 ]
then
    # do something
fi
Run Code Online (Sandbox Code Playgroud)

如果你的SH真的来砸然后把你的测试,(( ))像这样

if (( $n % 5 == 0 ))
then
     # do something
fi
Run Code Online (Sandbox Code Playgroud)

  • 请注意,bash 中负数的模运算仅返回余数,而不是数学模数结果。这意味着,虽然数学上的“-12 mod 10”是“8”,但 bash 会将其计算为“-2”。您可以使用简单的 `echo $((-12 % 10))` (`-2`) 对其进行测试,并将其与 python3 `python3 -c "p​​rint(-12 % 10)"` (`8`) 进行比较。 (2认同)

ziu*_*ziu 16

在shell中进行数学运算时应该使用bc

if [ `echo "3 % 2" | bc` -eq 0 ]
Run Code Online (Sandbox Code Playgroud)

  • Android 终端没有 `bc` (2认同)

小智 6

if (($n%5==0))
then
    # do something
fi
Run Code Online (Sandbox Code Playgroud)

  • @ neverMind9似乎是我的入门示例之一的较晚版本。 (3认同)

Lin*_*eak 5

关于以上答案的注释

  • 反引号现在被认为已弃用(许多进一步的注释),所以我建议切换到$(( ... ))$( ... )构造。

  • 两者expr手册页),和bc手册页)是外部命令,并且这样会导致在比矿或上述那些更复杂的例子一些可测量的减速。此外,已经有一种方法可以轻松避免它们(两者)。此外,例如,默认情况下它们可能并非在所有系统上都可用。


建议的新解决方案

(在某些条件下可能不完美,我只测试了基本场景。)

最简单的同时可移植且符合 POSIX 的正确代码(无 Bashisms(Greg 的 Wiki 介绍如何将 Bash 片段重写为 POSIX);(POSIX 维基百科概述))来测试数字的奇怪性(例如)如下:

#!/bin/sh
n=10
if [ $(( n % 2 )) -eq 0 ]; then
    printf '%s\n' "Number $n is Even"
else
    printf '%s\n' "Number $n is Odd"
fi
Run Code Online (Sandbox Code Playgroud)

当然,您可以在那里测试任何模数,而不仅仅是数字是偶数/奇数。