スクリプトの奇妙な構文エラー

スクリプトの奇妙な構文エラー

CPU%、pps、および受信kbpsを取得するbashスクリプトを作成しています。

#!/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シェルで特別です。シェルはこの変数の値を文字として使用して、引用符なしの拡張結果を区別し、readユーティリティの動作に影響します。デフォルトでは、この変数には3文字のスペース、タブ、および改行が含まれています。

IFS="enp0s3"たとえばstring=alpha、ランニングはシェルが文字列の一部を分割するためにecho $string出力されます。al hap$IFS

このIFS変数は、readユーティリティが値を変数として読み取る方法にも影響し、読み取った文字列を文字に分割します$IFS。数値のインスタンス0が消えるので、これが特定の問題を引き起こすと思います3

この問題を解決するには、別の変数名(たとえば)を使用してくださいifs。一般に、小文字の変数名を使用すると、これらの問題を回避できます。

また見なさい:

おすすめ記事