Bash 예상되는 정수 표현식 가져오기

Bash 예상되는 정수 표현식 가져오기

디스크 사용량을 확인하는 다음 스크립트가 있습니다

    #!/bin/bash

# set alert level 90% is default
ALERT=10

OIFS=$IFS
IFS=','

storage=$(df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }')



for output in $storage ;

do
  echo "---------------@@@@@@@@@ output started @@@@@@@@@@@@@@@@-----------"
  echo $output
  echo "---------------@@@@@@@@@ output end @@@@@@@@@@@@@@@@-----------"

  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1  )
  echo "---------------###### useo started ######-----------"
  echo $usep
  echo "---------------###### usep end ######-----------"

  if [ $usep -ge $ALERT ]; then

    echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" 
  fi
done

하지만 이 코드를 실행하면 if 조건문에서 정수 표현식 예상 오류가 발생하고 이것이 이 스크립트의 출력입니다.

  97% /dev/sda1
1% udev
0% none
2% none
---------------@@@@@@@@@ output end @@@@@@@@@@@@@@@@-----------
---------------###### useo started ######-----------
97
1
0
2
---------------###### usep end ######-----------
./fordiskfor.sh: line 24: [: 97
1
0
2: integer expression expected

답변1

문제는 거기에 있습니다:

if [ $usep -ge $ALERT ]; then
  ...
fi

$usep여러 줄의 숫자가 포함되어 있습니다. 모든 항목을 반복하려면 해당 부분 대신 다음과 같은 것을 사용하십시오.

for $space in $usep;
do
  if [ $space -ge $ALERT ]; then
    echo "Running out of space..."
  fi
done

답변2

변수에 저장된 값은 $storage여러 행으로 구성됩니다. 그러므로 $output줄도 여러 개 있을 것이므로 $usep.

$usepfor에 설명된 대로 다른 루프를 사용하여 저장된 모든 값을 하나씩 추출하고 비교할 수 있습니다.이것답변. 또는 while다음과 같은 문을 사용할 수 있습니다 .

echo $storage | while read output
do      
    ...
    ...

    if [ $usep -ge $ALERT ]; then    
    echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)"
  fi
done

관련 정보