bash脚本expr-算术语法错误

bash脚本expr-算术语法错误,bash,shell,expr,Bash,Shell,Expr,我制作了一个bash脚本,使用ifconfig每10秒监控一次网络流量。它一定是ifconfig,否则我会使用不同的工具 我的问题是因为我的计数器太高,我必须使用expr进行计算,但是expr给我带来了一些问题 #!/bin/bash #run for how many seconds savefile=/root/eth0.csv timer=10 echo "EPOCH,Interface,TX,RX,ChangeTx,ChangeRX" >> $savefile END=

我制作了一个bash脚本,使用ifconfig每10秒监控一次网络流量。它一定是ifconfig,否则我会使用不同的工具

我的问题是因为我的计数器太高,我必须使用
expr
进行计算,但是
expr
给我带来了一些问题

#!/bin/bash
#run for how many seconds

savefile=/root/eth0.csv
timer=10

echo "EPOCH,Interface,TX,RX,ChangeTx,ChangeRX" >> $savefile

END=8640
x=$END
while [ $x -gt 0 ]; do

ETH0RX=`ifconfig | grep eth0 -A8 | grep "RX bytes" | tr -s ' ' | cut -d':' -f2 | cut -d ' ' -f1`
ETH0TX=`ifconfig | grep eth0 -A8 | grep "RX bytes" | tr -s ' ' | cut -d':' -f3 | cut -d ' ' -f1`

#ETH0 RX
ETH0RXcurrentvalue=$ETH0RX
ETH0RXchange=$(expr $ETH0RXcurrentvalue - $ETH0RXpreviousvalue)
ETH0RXpreviousvalue=$ETH0RXcurrentvalue

#ETH0 TX
ETH0TXcurrentvalue=$ETH0TX
ETH0TXchange=$(expr $ETH0TXcurrentvalue - $ETH0TXpreviousvalue)
ETH0TXpreviousvalue=$ETH0TXcurrentvalue

epoch=`date +%s`

echo $epoch,ETH0,$ETH0TX,$ETH0RX,$(($ETH0RXchange*8)),$(($ETH0TXchange*8)) >> $savefile

sleep $timer

x=$(($x-1))
done;

我的错误是
第33行:算术语法错误
(即
完成;
)。如果没有
expr
,脚本工作正常,但是由于数字太大,我需要使用
expr
(我不能使用
bc
)。

我已经解决了这个问题

因为我正试着做一个

expr

然后在脚本后面我做了另一个计算

expr

由于另一行的计算是通过echo进行的,因此不断给出错误

因此,我使用下面的代码进行了修复

ETH0RXcurrentvalue=$ETH0RX
ETH0RXchange=$(expr "$ETH0RXcurrentvalue" - "$ETH0RXpreviousvalue")
ETH0RXpreviousvalue=$ETH0RXcurrentvalue
ETH0RXchange1=$(expr "$ETH0RXchange" \* "8")
echo $ETH0RXchange1
echo $ETH0TXchange1


echo $epoch,ETH0,$ETH0TX,$ETH0RX,$ETH0RXchange1,$ETH0TXchange1 >> $savefile

您需要将
ETH0RXpreviousvalue
ETH0TXpreviousvalue
分配给初始值(可能是0)。或者你可以说
ETH0RXchange=$((ETH0RXcurrentvalue-ETH0RXpreviousvalue))
,这比使用
expr
要好。我必须expr,因为我的号码是122121211221221221221221221221221221221221221221221221221221221221221221221221221221221221221221,因为它比4位长,这就是为什么我要使用expr你试过我的代码了吗?Bash使用的是有符号的64位整数。@tshiono,你的代码就是我以前使用的代码,它可以工作,只是当计数器达到一个很长的数字时,结果总是0,所以有一段时间我没有值,因为计数器无法进行计算,这就是为什么我要查看expr,否则这就可以正常工作了。@Svan:line
done不包含任何算术表达式,因此这不会是有问题的行。您可以在
while
表达式中执行算术(这没有错,但是可以更好地写成
while((x>0))
),在
完成之前的增量部分,这看起来也不错(但是可以更好地写成
((x=x-1))
),因此问题一定在
echo
行。发生错误时,
ETH0RXchange
的值是多少?