스크립트의 이상한 구문 오류

스크립트의 이상한 구문 오류

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 hap$IFS

IFS변수는 read유틸리티가 값을 변수로 읽는 방법에도 영향을 미치며, 읽은 문자열을 문자로 분할합니다 $IFS. 숫자의 인스턴스가 0사라지기 때문에 이것이 특정 문제를 일으키는 것이라고 생각합니다 3.

이 문제를 해결하려면 다른 변수 이름(예: )을 사용하십시오 ifs. 일반적으로 소문자 변수 이름을 사용하면 이러한 문제를 피할 수 있습니다.

또한보십시오:

관련 정보