Nagios bash语法错误

我想引用这个问题到下面的post,我得到Skript: Post with Script

我正在使用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 -lc -w 10240 -c 8192 -p 12489 -s PASSWORD 

UPDATE

谢谢你的帮助! 它现在工作:)现在脚本看起来像这样:

 #!/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 

对我来说,它看起来像“如果testing”中的左操作数是空的。

关于为什么可能有一个空值,我build议你从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 }'

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

  • 总是把variables用双引号括起来, 无处不在
  • 总是喜欢$()而不是反引号扩展, 无处不在
  • 总是把shell扩展用双引号括起来, 无处不在

当然,很less有例外,例如当您testing数字值时。

我不是故意粗鲁,只要确保你明白这是多么重要:)

一部开拓创新:

 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

UDPATE:纠正了一些错别字