我想针对这个问题参考一下我得到 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 命令并查看它的作用。它的输出是什么?运行所有步骤直到输出:
/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4
/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }'
/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
更新:修正了一些错别字