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