【问题标题】:Calculate modulo in sh script在 sh 脚本中计算模数
【发布时间】:2012-01-09 18:11:29
【问题描述】:

我正在编写一个 sh 脚本,在该脚本中,我处于 ​​WHILE 循环中,每次迭代都会增加一个变量,并且我想每五次迭代保存一个文件。

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

干杯!

【问题讨论】:

    标签: sh modulo


    【解决方案1】:

    以上答案的注释

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

    • expr (man page) 和 bc (man page) 都是外部命令,因此在比我的示例或上述示例更复杂的示例中会导致一些可测量的减速。此外,已经有一种方法可以轻松避免它们(两者)。此外,默认情况下,它们可能并非在所有系统上都可用。


    建议的新解决方案

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

    用于测试数字的奇数(例如)的最简单但可移植且符合 POSIX 的正确代码(无 Bashisms (Greg's Wiki on how to re-write Bash snippets to POSIX); (Wikipedia overview on 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
    

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

    【讨论】:

      【解决方案2】:

      如果你的 sh 真的是 sh 而不仅仅是 bash 作为 sh 运行,那么这将正常工作

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

      如果你的 sh 真的是 bash,那么把你的测试放在 (( )) 像这样

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

      【讨论】:

      • 请注意,bash 中负数的模运算仅返回余数,而不是数学模结果。这意味着,虽然 -12 mod 10 在数学上是 8,但 bash 会将其计算为 -2。你可以用简单的echo $((-12 % 10)) (-2) 测试它,并与python3 python3 -c "print(-12 % 10)" (8) 进行比较。
      【解决方案3】:

      在 shell 中做数学时应该使用 bc

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

      【讨论】:

      • 安卓终端没有bc
      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多