尝试在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)'
如何在括号内执行操作,以免出现语法错误?在此先感谢您的帮助。
答案 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`