脚本中奇怪的语法错误

脚本中奇怪的语法错误

我正在创建一个 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。一般来说,使用小写变量名可以避免此类问题。

也可以看看:

相关内容