使用给定会给出错误



我几乎完成了nagios插件,我正在使用本指南。我遇到了错误,我不知道为什么。

#!/bin/perl
use strict;
use warnings;
my $warn = 20;
my $crit = 50;
my $percent_down = 10;
my $percent_up = 90;
my $err = "error";
given ($percent_down) {
when ($percent_down lt $warn) { print "OK - $percent_up% UP"; exit 0;}
when ($percent_down ge $warn && lt $crit ) { print "WARNING - $percent_down% DOWN"; exit (1);}
when ($percent_down ge $crit) { print "CRITICAL - $percent_down% DOWN"; exit (2);}
default { print "UNKNOWN - $err "; exit (3);}
}

我得到语法错误从") {"given ($percent_down) {开始,然后从之后的每一行的";}"开始。

要使用given,您需要

no if $] >= 5.018, warnings => "experimental::smartmatch";
use feature qw( switch );

$percent_down ge $warn && lt $crit

应该是

$percent_down ge $warn && $percent_down lt $crit

现在对于你没有问的问题。

ltge用于比较字符串。使用<>=来比较数字。(例如,9 ge 10为真。


最后,您不应该使用given-when.这是一项实验性功能,将来将以向后不兼容的方式删除或更改。


修复上述问题并删除冗余检查后,您将剩下以下内容:

if ($percent_down < $warn) {
print "OK - $percent_up% UP";
exit(0);
}
if ($percent_down < $crit) {
print "WARNING - $percent_down% DOWN";
exit(1);
}
print "CRITICAL - $percent_down% DOWN";
exit(2);

出于多种原因,建议您避免givenwhen。即使你正确地启用了该功能,你也会收到另一一系列警告消息,告诉你该功能是实验性的,无论如何你都没有使用该功能有用的设施——主要是智能匹配,这也是实验性的。

最终的when块永远无法输入,因为上述条件涵盖了所有可能性

我建议您使用这样的ifelsifelse序列编写它。我相信这样更易读

#!/bin/perl
use strict;
use warnings 'all';
my $warn = 20;
my $crit = 50;
my $percent_down = 10;
my $percent_up   = 100 - $percent_down;
if ( $percent_down < $warn ) {
print "OK - $percent_up% UP";
exit 0;
}
elsif ( $percent_down < $crit ) {
print "WARNING - $percent_down% DOWN";
exit 1;
}
else {
print "CRITICAL - $percent_down% DOWN";
exit 2;
}

感谢您的评论,我明白了。

if ($percent_down lt $warn) {
print "OK - $percent_up% UP";
exit 0;
} elsif ($percent_down ge $warn && $percent_down lt $crit ) {
print "WARNING - $percent_down% DOWN";
exit 1;
} elsif ($percent_down ge $crit) {
print "CRITICAL - $percent_down% DOWN";
exit 2;
} else {
print "UNKNOWN - $err ";
exit 3;
}

相关内容

  • 没有找到相关文章

最新更新