Bash数学:除以一或计算一个数字是否可被另一个数字整除的错误

扎克·安格(Zac Anger)

在正在处理的脚本中使用了此答案的解决方案,但它似乎不适用于我。我使用的是Bash5。这是一个简化的测试用例,我希望do_thing函数在5的倍数处被调用(除了$min$minutes相同时除外,因为在真实脚本中,我do_thing是在main的开头触发的)循环),但运行它还会触发这些倍数+ 1,因此很明显,我在某处有点偏离或出现数学错误,但我没有看到它。有任何想法吗?

#!/usr/bin/env bash

minutes=6
sec=00
min="$minutes"

do_thing() {
  echo 'done thing'
}

while [ "$min" -ge 0 ]; do
  remainder=$(( min % 5 ))
  # TODO: this is broken
  [ "$remainder" -eq 0 ] && [ "$min" -ne "$minutes" ] && do_thing
  while [ $sec -ge 0 ]; do
    echo "$min $sec"
    ((sec=sec-1))
    sleep 1
  done
  sec=59
  ((min=min-1))
done
主机

调试任何bash脚本的第一件事是set -x在最顶部添加这将使您看到脚本在做什么,在循环的每次迭代中每个测试的外观,等等。

这是我要放的地方:

#!/usr/bin/env bash

# NOTE: Remove or comment the below line when you're done debugging!
set -x

minutes=6
sec=00
...

echo "myvar = $myvar"在你的代码,而你也调试可以帮助你在你的脚本的关键点跟踪变量的值,这样你就可以把它比作什么,你认为它应该是。

逻辑上的缺陷是,一旦获得让您退出“分钟计数器”循环的条件,便会立即将min减少1,因此,当您重新计算其余部分时,总会减少1。你递减的“柜台”前,你使用它所需的计算!

从逻辑上讲,您要测试seconds = 0,然后计算余数,然后为下一个循环进行设置:

#!/usr/bin/env bash

#set -x

minutes=6
sec=00
min="$minutes"

do_thing() {
  echo 'done thing'
}

while [ "$min" -ge 0 ]; do
  while [ $sec -ge 0 ]; do
    echo "$min $sec"
    ((sec=sec-1))
    sleep 1
  done
  remainder=$(( min % 5 ))
  # Added echo for debugging
  echo "remainder = $remainder"
  [ "$remainder" -eq 0 ] && [ "$min" -ne "$minutes" ] && do_thing
  sec=59
  ((min=min-1))
done

另一件事在这里引人注目-请非常小心-&&||-它们既方便又脏又好,但是对于复杂的逻辑,它们可能会欺骗您!

这些逻辑运算符有时不能以适当的方式代替,即使它们有时会以这种方式运行-与使用例如if []; then...测试的差异是它们以静默方式使用了退出代码。阅读它们,不要连续使用多个它们,而不必同时使用它们()来强制执行所需的操作顺序。

如果您想听取我的建议,并避免&&在这里使用,这是一种方法(嵌套的if是另一种方法,但是如果不需要的话,我不想使用那些方法):

  ...
  remainder=$(( min % 5 ))
  # Added echo for debugging
  echo "remainder = $remainder"
  if ([ "$remainder" -eq 0 ] && [ "$min" -ne "$minutes" ]); then
    do_thing
  fi
  sec=59
  ((min=min-1))
  ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

数字以及可被另一个数字整除的数字的数字(例如 3)

来自分类Dev

检查列表中的数字是否可被另一个数字整除的最有效方法

来自分类Dev

找出一个很大的数字是否可以被另一个数整除

来自分类Dev

C程序输出一个数字是否可被3整除

来自分类Dev

计算一个静态数字适合另一个数字的次数

来自分类Dev

Haskell-一个无限列表,可被给定列表的每个数字整除

来自分类Dev

如果一个数字除以R中的另一个太小的数字怎么办

来自分类Dev

如何检查一个数字是否可以被列表中的每个数字整除

来自分类Dev

最多更改一个数字就可以获得多少个可被3整除的数字

来自分类Dev

最多更改一个数字就可以获得多少个可被3整除的数字

来自分类Dev

从PHP中的另一个数字中提取一个数字

来自分类Dev

如何确定一个数字是否在另一个数字的某个范围内

来自分类Dev

计算一个数组中的数字出现在另一个数组中的次数

来自分类Dev

使用Python递归检查一个数字是否可以被其他数字平均整除

来自分类Dev

sql获取一个范围为另一个数字的数字

来自分类Dev

构造一个循环来检查一个数字的数字之和是否可以被 3 整除

来自分类Dev

如何将数字转换为R中另一个数字的第一个整除数

来自分类Dev

如何检查一个数字进入另一个数字内并在php中基于该数字创建一个数组?

来自分类Dev

将向量的每三个数字除以另一个向量中的值

来自分类Dev

找到下一个数字除以8?

来自分类Dev

查找另一个数字介于哪个数字对之间的优化方法?

来自分类Dev

使用字符串从另一个类计算两个数字

来自分类Dev

检查一个数字是否可以被 20 整除 MATLAB

来自分类Dev

打印一个数字,然后擦除它并在其位置打印另一个数字

来自分类Dev

我如何检查一个数字是高于还是低于另一个数字?

来自分类Dev

Typescript 接口期望一个数字道具小于另一个数字道具

来自分类Dev

检查一个值是否等于Django模板中另一个数字的模

来自分类Dev

在PYTHON中将一个数字替换为另一个

来自分类Dev

选择一个数字序列,然后链接到另一个查询

Related 相关文章

  1. 1

    数字以及可被另一个数字整除的数字的数字(例如 3)

  2. 2

    检查列表中的数字是否可被另一个数字整除的最有效方法

  3. 3

    找出一个很大的数字是否可以被另一个数整除

  4. 4

    C程序输出一个数字是否可被3整除

  5. 5

    计算一个静态数字适合另一个数字的次数

  6. 6

    Haskell-一个无限列表,可被给定列表的每个数字整除

  7. 7

    如果一个数字除以R中的另一个太小的数字怎么办

  8. 8

    如何检查一个数字是否可以被列表中的每个数字整除

  9. 9

    最多更改一个数字就可以获得多少个可被3整除的数字

  10. 10

    最多更改一个数字就可以获得多少个可被3整除的数字

  11. 11

    从PHP中的另一个数字中提取一个数字

  12. 12

    如何确定一个数字是否在另一个数字的某个范围内

  13. 13

    计算一个数组中的数字出现在另一个数组中的次数

  14. 14

    使用Python递归检查一个数字是否可以被其他数字平均整除

  15. 15

    sql获取一个范围为另一个数字的数字

  16. 16

    构造一个循环来检查一个数字的数字之和是否可以被 3 整除

  17. 17

    如何将数字转换为R中另一个数字的第一个整除数

  18. 18

    如何检查一个数字进入另一个数字内并在php中基于该数字创建一个数组?

  19. 19

    将向量的每三个数字除以另一个向量中的值

  20. 20

    找到下一个数字除以8?

  21. 21

    查找另一个数字介于哪个数字对之间的优化方法?

  22. 22

    使用字符串从另一个类计算两个数字

  23. 23

    检查一个数字是否可以被 20 整除 MATLAB

  24. 24

    打印一个数字,然后擦除它并在其位置打印另一个数字

  25. 25

    我如何检查一个数字是高于还是低于另一个数字?

  26. 26

    Typescript 接口期望一个数字道具小于另一个数字道具

  27. 27

    检查一个值是否等于Django模板中另一个数字的模

  28. 28

    在PYTHON中将一个数字替换为另一个

  29. 29

    选择一个数字序列,然后链接到另一个查询

热门标签

归档