首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写一个Shell脚本发送电子邮件在磁盘空间全整数表达式期望?

写一个Shell脚本发送电子邮件在磁盘空间全整数表达式期望?
EN

Stack Overflow用户
提问于 2015-12-01 04:44:32
回答 1查看 202关注 0票数 1

全新的Shell脚本。

在执行SH脚本时,我得到以下异常:

代码语言:javascript
复制
/dev/mapper/VolGroup00-root
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-root: integer  expression expected
/ 5.2G
./DiskSpace.sh: line 7: [: /: integer expression expected
29% /dev/xvda1
/dev/mapper/VolGroup00-home
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-home: integer expression expected
/home 5.2G
./DiskSpace.sh: line 7: [: /home: integer expression expected
/dev/mapper/VolGroup00-opt
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-opt: integer expression expected
/opt 5.3G
./DiskSpace.sh: line 7: [: /opt: integer expression expected
/dev/mapper/VolGroup00-var
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-var: integer expression expected
/var 5.3G
./DiskSpace.sh: line 7: [: /var: integer expression expected

下面是我要执行的脚本:

代码语言:javascript
复制
#!/bin/sh
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' |   while read output;
do
  echo $output
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1  )
  partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge 90 ]; then
  echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
  mail -s "Alert: Almost out of disk space $usep%" azrael@opinkerfi.com
fi
done

以下是linux系统上df -h的输出:

代码语言:javascript
复制
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-root
                  4.8G  1.9G  2.7G  42% /
tmpfs                 3.9G     0  3.9G   0% /dev/shm
/dev/xvda1            194M   52M  132M  29% /boot
/dev/mapper/VolGroup00-home
                  4.9G  1.9G  2.8G  41% /home
/dev/mapper/VolGroup00-opt
                  5.0G  4.4G  360M  93% /opt
/dev/mapper/VolGroup00-var
                  5.0G  3.7G  1.1G  78% /var
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 04:53:06

我建议将这里的大部分逻辑从外部命令移到shell本身;通过消除对awk、grep和&c的所有不必要调用而节省的性能节省了启动bash的额外成本,而不是/bin/sh。

至于眼前的bug,请确保您的值实际上是整数。这意味着不仅要删除%符号,还要删除任何小数点。此外,使用df -P,以确保符合POSIX的输出(这将确保您的列号实际上是什么,以及您认为它们在哪里)。

代码语言:javascript
复制
#!/bin/bash
ignore_re='^Filesystem|tmpfs|cdrom'
while read -r line; do
  [[ $line ]] || continue # skip empty lines
  [[ $line =~ $ignore_re ]] && continue
  read -r filesystem blocks_total blocks_used blocks_avail cap_pct mounted_at _ <<<"$line"
  # below is a noop but makes set -x output more useful
  : filesystem="$filesystem" blocks_total="$blocks_total" blocks_used="$blocks_used" blocks_avail="$blocks_avail" cap_pct="$cap_pct" mounted_at="$mounted_at"
  usep=${cap_pct%"%"} # trim trailing % sign
  usep=${usep%.*}     # round (down) to nearest decimal
  if (( usep >= 90 )); then
    mail -s "Alert: Almost out of disk space $usep%" azrael@opinkerfi.com <<EOF
$filesystem (mounted on $mounted_at) usage is $usep on $(hostname) as of $(date)
EOF
  fi
done < <(df -P)

如果您的shell是bash4.1或更新版本,您还可以消除对$(date)的外部调用,以支持printf用于调用strftime的新%()T内置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34012765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档