Nagios bash 语法错误

Nagios bash 语法错误

我想针对这个问题参考一下我得到 Skript 的以下帖子: 带脚本的帖子

我正在使用 Bash 4.1.2(1),当我尝试执行脚本时,收到以下错误消息:

 ./check_disk_by_size.sh: Zeile 9: [: ==: Einstelliger (unärer) Operator erwartet.
(standard_in) 1: syntax error
./check_disk_by_size.sh: Zeile 13: [: -eq: Einstelliger (unärer) Operator erwartet.
(standard_in) 1: syntax error
(standard_in) 1: syntax error
./check_disk_by_size.sh: Zeile 16: [: Zu viele Argumente.
(standard_in) 1: syntax error
./check_disk_by_size.sh: Zeile 19: [: -eq: Einstelliger (unärer) Operator erwartet.

我有基本的 Bash 脚本编写经验,但每当我更改某些内容时,就会出现更多错误。我无法将其投入使用。

编辑 1:这是脚本

#!/bin/bash

FREESPACE=`/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD \
-v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }' | awk -F "|" '{ print $1 }'`

SIZE=`echo $FREESPACE | awk '{ print $2 }'`
UNIT=`echo $FREESPACE | awk '{ print $3 }'`

if [ $UNIT == "Gb" ]; then
    SIZE=`echo $SIZE \* 1024 | bc`
fi

if [ `echo "$SIZE >= $6" | bc` -eq 1 ]; then
    echo "$4:\_Drive_Space OK - $FREESPACE"
    exit 0
elif [ `echo "$SIZE < $6" | bc` -eq 1 -a `echo "$SIZE > $8" | bc` -eq 1 ]; then
    echo "$4:\_Drive_Space WARNING - $FREESPACE"
    exit 1
elif [ `echo "$SIZE <= $8" | bc` -eq 1 ]; then
    echo "$4:\_Drive_Space CRITICAL - $FREESPACE"
    exit 2
fi

我像这样运行脚本:

./check_disk_by_size -H [IP_Adress] -l [DRIVE] -w [INTEGER] -c [INTEGER] -p [PORT] -s [PASSWORD]

例子:

./check_disk_by_size -H 192.168.1.110 -l c -w 10240 -c 8192 -p 12489 -s PASSWORD

更新

谢谢你的帮助!现在可以正常工作了 :) 脚本现在如下所示:

#!/bin/bash
#

FREESPACE=`/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s Nag4AlphA \
-v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }' | awk -F "|" '{ print $1 }'`

SIZE=`echo $FREESPACE | awk '{ print $2 }'`
UNIT=`echo $FREESPACE | awk '{ print $3 }'`

if [ "$UNIT" == "Gb" ]; then
    SIZE="$(echo "$(($SIZE * 1024))" | bc)"
fi


echo $SIZE
echo " " 
echo $6
echo " "
echo $8

if [ $SIZE -ge $6 ]; then
    echo "$4:\_Drive_Space OK - $FREESPACE"
    exit 0
elif [ $SIZE -lt $6 -a $SIZE -gt $8 ]; then
    echo "$4:\_Drive_Space WARNING - $FREESPACE"
    exit 1
elif [ $SIZE -lt $8 ]; then
    echo "$4:\_Drive_Space CRITICAL - $FREESPACE"
    exit 2
fi

答案1

对我来说,“if test”中的左操作数似乎为空。

关于为什么可能有一个空值,我建议您从 shell 运行 Nagios 命令并查看它的作用。它的输出是什么?运行所有步骤直到输出:

  1. /usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4

  2. /usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }'

  3. /usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }' | awk -F "|" '{ print $1 }'

关于脚本本身,我“善意建议”:

  • 总是将变量括在双引号中,到处
  • 总是更喜欢$()使用反引号来扩展 shell,到处
  • 总是将 shell 扩展括在双引号中,到处

当然,很少有例外,例如当您测试数值时。

我无意无礼,只是想确保你明白这有多重要:)

原文:

if [ $UNIT == "Gb" ]; then
    SIZE=`echo $SIZE \* 1024 | bc`
fi

硬化:

if [ "$UNIT" == "Gb" ]; then
    SIZE="$(echo "$SIZE * 1024" | bc)"
fi

自从我开始坚持遵循这些规则后,就再也没有遇到过任何问题。

这是一篇关于 Bash 脚本最佳实践的精彩文章:http://www.davidpashley.com/articles/writing-robust-shell-scripts/另一个关于 shell 扩展http://mywiki.wooledge.org/BashFAQ/082

更新:修正了一些错别字

相关内容