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

时间:2014-01-08 02:53:00

标签: bash shell unix scripting

尝试在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)'

如何在括号内执行操作,以免出现语法错误?在此先感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

必须对括号和其他符号进行转义,以便shell不会解释它们。 你也需要在parens周围留出空间。

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

答案 2 :(得分:1)

您可以使用 $(())

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

答案 3 :(得分:1)

首先,你的括号被解释为是globs的一部分,但是模式似乎没有被终止(因为它们之间有空格)。[1]这些将需要逃脱; *也需要转义以避免被用作glob。

其次,expr实际上不接受括号作为其中一个参数的 part ;他们需要单独的论点。

因此,你可能想要

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

同样地,

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

尽管如此,bash也提供了$(( ))构造,并且使用它可能更好。

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

答案 4 :(得分:1)

作为一个完全不同的解决方案,你有没有想过使用命令行程序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`