我正在创建一个 bash 脚本来获取 cpu%、pps 和传入的 kbps
#!/bin/bash
INTERVAL="0.5" # update interval in seconds
IFS="enp0s3"
while true
do
# Read /proc/stat file (for first datapoint)
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
# compute active and total utilizations
cpu_active_prev=$((user+system+nice+softirq+steal))
cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
sleep $INTERVAL
# Read /proc/stat file (for second datapoint)
read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
# compute active and total utilizations
cpu_active_cur=$((user+system+nice+softirq+steal))
cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
# compute CPU utilization (%)
cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
echo "CPU: $cpu_util"
R4=$(cat /sys/class/net/$IFS/statistics/rx_bytes)
sleep $INTERVAL
R5=$(cat /sys/class/net/$IFS/statistics/rx_bytes)
R8BPS=$(expr $R5 - $R4)
RKBPS=$(expr $R8BPS / 125)
echo "IN: $RKBPS"
R1=$(cat /sys/class/net/$IFS/statistics/rx_packets)
T1=$(cat /sys/class/net/$IFS/statistics/tx_packets)
sleep $INTERVAL
R2=$(cat /sys/class/net/$IFS/statistics/rx_packets)
T2=$(cat /sys/class/net/$IFS/statistics/tx_packets)
RBPS=$(expr $R2 - $R1)
echo "PPS : $RBPS"
done
我收到语法错误:
line 11: u 2: syntax error in expression (error token is "2")
有人可以帮我解决这个问题吗?
答案1
问题来自于您正在使用一个名为 的变量IFS
。该IFS
变量在任何 POSIX shell 中都是特殊的。 shell 使用此变量的值作为字符来分割不带引号的扩展的结果,并且它会影响read
实用程序的操作。默认情况下,该变量包含三个字符空格、制表符和换行符。
对于IFS="enp0s3"
and 例如string=alpha
,运行echo $string
会输出,al ha
因为 shell 会分割 上的字符串,p
它是 的一部分$IFS
。
该IFS
变量还会影响read
实用程序将值读取到变量中的方式,从而将读取的字符串拆分为 中的字符$IFS
。我认为正是这一点造成了您的具体问题,因为数字的任何实例0
都会3
消失。
要解决此问题,请使用另一个变量名称,例如ifs
。一般来说,使用小写变量名可以避免此类问题。
也可以看看: