用括号评估数学方程

时间:2014-03-18 10:23:34

标签: shell unix math ksh

我只想将秒转换回小时n分钟一天。但是我在Minute Equation中遇到错误!它没有评估订单中的大括号!我们如何能够像下面的数学方程那样评估数学方程式。

我想将total_secs除以3600,然后将结果乘以60然后再次找到60的结果模数。

这是我的尝试

#!/bin/ksh  
set -x  
total_secs=3685;  
hour=$(( (total_secs % 3600) ));  
minute=$(( (((total_secs / 3600) * 60) % 60) ));  
seconds=$(( (((total_secs / 3600) * (60) * (60)) % 60) ));  
echo ""$hour":"$minute":"$seconds""  

提前致谢

1 个答案:

答案 0 :(得分:1)

操作的顺序不是造成问题的原因。根据{{​​3}},Korn shell具有与C编程语言相同的优先级和关联性,因此乘法,除法和余数从左到右发生。正确的数学将是:

#!/bin/ksh

total_secs=3685
hour=$(( total_secs / 3600 ))
minute=$(( total_secs / 60 % 60  )) # equivalent to (total_secs / 60) % 60
seconds=$(( total_secs % 60 ))
echo "$hour:$minute:$seconds"
# output 1:1:25

如果要格式化输出,也许可以使用printf

printf "%02d:%02d:%02d\n" $hour $minute $seconds
# output 01:01:25

编辑:运算符优先级

基本算术运算按以下顺序进行:

  1. * / %
  2. + -
  3. 相同优先级的多个操作将从左侧到右侧进行评估,因为它们出现在表达式中。

    $(( ((x*y) / z) + n ))
    

    相当于以下任何一种:

    $(( x * y / z + n ))
    $(( n + x * y / z ))
    

    因为在这两种情况下,*是最高优先级并且最接近表达式的左侧。第二个是/,最后是+

    插入额外的( )以使您的意图清晰无误,但请记住整个表达必须包含在$(( ))中。