如何在 bash 中执行简单的算术选项而不会出现语法错误



尝试在 bash shell 脚本中进行一些简单的计算时,我遇到了语法错误。 显然我做错了,但希望有人能指出我正确的方向。

diffSec=`expr $diff % 60`              # works fine
diffMin=`expr $diff / 60 % 60`         # works fine
diffHr=`expr $diff / (60 * 60)`        # giving me problems due to the parens
testerme=`expr $diff / 3600`           # works fine but will use only as a work around
diffDay=`expr $diff / (60 * 60 * 24)`  # problems again

这是我得到的语法错误:

./testscript.sh: command substitution: line 27: syntax error near unexpected token `('
./testscript.sh: command substitution: line 27: `expr $diff / (60 * 60)'
./testscript.sh: command substitution: line 29: syntax error near unexpected token `('
./testscript.sh: command substitution: line 29: `expr $diff / (60 * 60 * 24)'

如何在括号内执行内容,以免出现语法错误? 提前感谢您的帮助。

你可以

使用 $(( ))

diffSec=$(( $diff % 60 ))              # works fine
diffMin=$(( $diff / 60 % 60 ))        # works fine
diffHr=$(( $diff / (60 * 60) ))       # giving me problems due to the parens
testerme=$(( $diff / 3600 ))          # works fine but will use only as a work around
diffDay=$(( $diff / (60 * 60 * 24) )) # problems again
diff=1234567
diffSec=$(( $diff % 60))         
diffMin=$(( $diff / 60 % 60))    
diffHr=$(( $diff / (60 * 60))) 
testerme=$(( $diff / 3600)) 
diffDay=$(( $diff / (60 * 60 * 24)))
echo $diffDay days $diffHr hours $diffMin min $diffSec sec

输出:

14 days 342 hours 56 min 7 sec

括号和其他符号必须转义,以便外壳不会解释它们。此外,您需要在帕伦斯周围留出空间。

A=`expr 100000 / ( 60 * 60 )`

作为一个完全不同的解决方案,你有没有想过使用命令行程序dc(代表桌面计算器)?

它是一个基于堆栈的计算器(也称为反向抛光)

diffSec=`echo '$diff 60 %p' | dc`
diffMin=`echo '$diff 60 60 /%p' | dc`
diffHr=`echo '$diff 60 60 */p' | dc`
diffDay=`echo '$diff 60 60 24 **/p' | dc`

首先,你的括号被解释为球体的一部分,但模式似乎没有被终止(因为中间有一个空格)。1] 这些将需要被转义;*还需要逃逸以避免被用作球体。

其次,expr实际上并不接受括号作为其中一个参数的一部分;它们必须是单独的参数。

因此,您可能想要

diffHr=`expr $diff /  (60 * 60 )`

同样

diffHr=`expr $diff /  (60 * 60 * 24 )`

也就是说,bash也提供了$(( ))结构,使用它可能是一个更好的主意。

diffHr=$(( $diff/(60*60) ))
diffDay=$(( $diff/(60*60*24) ))

相关内容

  • 没有找到相关文章

最新更新