首页 > 解决方案 > [: Unix 中缺少 `]' 错误 | 外壳脚本

问题描述

我在 shell 脚本中遇到 [: missing `]' 错误

memuse=$ free -m                                                                      
if [ $memuse >80]
then                                                               
echo "Attention: memory utilisation is high on $(hostname) at $(date)" 

这是我的代码,我得到了类似的错误

[tono@webminal.org ~]$sh ./memory_alert.sh                                   
              total        used        free      shared  buff/cache   available       
Mem:          14522        2128        4004        1845        8389       10096       
Swap:             0           0           0                                           
./memory_alert.sh: line 2: [: missing `]' 

标签: linuxbashshellunix

解决方案


嗯,有很多问题。首先,要将某些命令的输出输出到 var,您需要这个

var=$( some_command )

二、输出free -m

              total        used        free      shared  buff/cache   available       
Mem:          14522        2128        4004        1845        8389       10096       
Swap:             0           0           0

怎么能和80比呢?看看您要比较的内容:

"total used free shared buff/cache availableMem: 14522 2128 4004 1845 8389 10096 Swap: 0 0 0" > 80

第三,free -m以兆字节显示内存信息,我假设您想要百分比,对吗?free输出中没有这样的指标。但是基于“可用”和“总计”,您可以计算内存使用百分比,然后将其与某个预定义值进行比较。好的,让我们尝试解决这个问题。

#!/bin/bash

memory_alert=80 # this will be an alerting value
memory_total=$( free | sed -n '2p' | awk '{print $2}' ) # get total memory by parsing free output with sed and awk
memory_available=$( free | sed -n '2p' | awk '{print $7}' ) # same with available memory
memory_used=$( echo 100-100*$memory_available/$memory_total | bc ) # calculate memory usage in %

# compare and alert if memory usage more than 80%
(( memory_used > memory_alert )) && echo "Attention: memory utilisation is high on $(hostname) at $(date)"

多亏了 Gordon,更紧凑的变体

#!/bin/bash
memory_alert=80 # this will be an alerting value
memory_used=$( free | awk 'NR==2 {print int(100-100*$7/$2)}' )
(( memory_used > memory_alert )) && echo "Attention: memory utilisation is high on $(hostname) at $(date)"

推荐阅读