在sh脚本中计算模数

时间:2011-11-30 14:01:21

标签: sh modulo

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

我通常做的事情(比如说C)会做if ( n % 5 == 0)测试,但我不知道这是否可行......?如果不是,是否有人有任何想法可以完成工作?

干杯!

4 个答案:

答案 0 :(得分:37)

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

if [ `expr $n % 5` -eq 0 ]
then
    # do something
fi

如果你的sh真的是bash,那就把你的考试放在(( ))这样

if (( $n % 5 == 0 ))
then
     # do something
fi

答案 1 :(得分:16)

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

if [ `echo "3 % 2" | bc` -eq 0 ]

答案 2 :(得分:4)

以上答案的注意事项

  • 反引号现在被视为已弃用(many further notes),因此建议您切换到 $(( ... )) $( ... ) 构造。

  • exprman page)和bcman page)都是外部命令,因此,在比我的或以上的。此外,已经有一种方法可以轻松地避免(两者)。另外,例如,默认情况下,它们可能并非在所有系统上都可用。


建议的新解决方案

(在某些情况下可能并不完美,我只是测试了基本情况。)

测试数字(作为示例)的可移植性和POSIX正确代码(无Bashisms(Greg's Wiki on how to re-write Bash snippets to POSIX;(Wikipedia overview on POSIX))的最简单方法如下:< / p>

#!/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

您当然可以在其中测试任何模数,而不仅仅是数字是偶数还是奇数。

答案 3 :(得分:3)

if (($n%5==0))
then
    # do something
fi