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
유틸리티 작동에 영향을 줍니다. 기본적으로 이 변수에는 세 문자의 공백, 탭 및 줄 바꿈이 포함됩니다.
IFS="enp0s3"
예를 들어 string=alpha
, running은 쉘이 문자열의 일부를 분할하기 때문에 echo $string
출력됩니다 .al ha
p
$IFS
이 IFS
변수는 read
유틸리티가 값을 변수로 읽는 방법에도 영향을 미치며, 읽은 문자열을 문자로 분할합니다 $IFS
. 숫자의 인스턴스가 0
사라지기 때문에 이것이 특정 문제를 일으키는 것이라고 생각합니다 3
.
이 문제를 해결하려면 다른 변수 이름(예: )을 사용하십시오 ifs
. 일반적으로 소문자 변수 이름을 사용하면 이러한 문제를 피할 수 있습니다.
또한보십시오: