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

$usep您可以使用另一个循环,逐一提取并比较存储在 中的所有值,for如中所述回答。或者您可以使用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

相关内容