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 ha
p
$IFS
このIFS
変数は、read
ユーティリティが値を変数として読み取る方法にも影響し、読み取った文字列を文字に分割します$IFS
。数値のインスタンス0
が消えるので、これが特定の問題を引き起こすと思います3
。
この問題を解決するには、別の変数名(たとえば)を使用してくださいifs
。一般に、小文字の変数名を使用すると、これらの問題を回避できます。
また見なさい: