使用未初始化的值 $5 并且参数不是数字 lt (<) 中的数字

Use of uninitialized value $5 and argument isn't numeric in numeric lt (<)

我正在探索 Perl 语言。我尝试创建一个脚本来集成到我的 Nagios 服务器中,但我遇到了两个无法解决的错误。你能帮帮我吗?

错误如下:

Use of uninitialized value in concatenation (.) or string at check_disque.pl line 53.

Argument "/dev/mapper/centos-root 50G 5,5G 45G 11 /\n" isn't numeric in numeric lt (<) at check_disque.pl line 55.

我的第 55 行:

$espace_utilise=`df -h / | awk 'FNR == 2 {print }' | sed 's/%//g'`;

第 56 行:

if ($espace_utilise < $warning) {

I'm discovering the language PERL.

然后看看来自 CPAN 的 CPAN. Among many modules there is Filesys::DiskSpace which does what you want. You need to install it first. In order to do that you need to learn how to INSTALL 个模块,

cpan App::cpanminus
cpanm Filesys::DiskSpace

应该适用于您的情况。请注意,如果您之前没有使用 cpan,它可能会询问您是否希望它自动配置自己。按回车键说是。

安装后使用就这么简单

use Filesys::DiskSpace;
($fs_type, $fs_desc, $used, $avail, $fused, $favail) = df $dir;

请注意,它不会隐式提供百分比,因此您需要遵循 df 行为

      The percentage of the normally available space that is currently allocated  to  all
      files on the file system. This shall be calculated using the fraction:

      <space used>/( <space used>+ <space free>)

   expressed as a percentage. This percentage may be greater than 100 if <space free> is less
   than zero. The percentage value shall  be  expressed  as  a  positive  integer,  with  any
   fractional result causing it to be rounded to the next highest integer.
$espace_utilise=`df -h / | awk 'FNR == 2 {print }' | sed 's/%//g'`;
#                                               ^^--- here 

反引号内插变量,因此 </code> 将由 Perl 内插。您可以通过使用反斜杠 <code>$5 转义美元符号或使用 qx'' 来解决此问题,这与反引号的作用相同,但单引号分隔符会禁用插值。不过,它会导致您的 awk/sed 命令出现一些问题。这将需要更多的逃避。这是在 Perl 中使用 shell 命令不是一个好主意的原因之一。

$espace_utilise=`df -h / | awk 'FNR == 2 {print $5}' | sed 's/%//g'`;
$espace_utilise=qx'df -h / | awk \'FNR == 2 {print }\' | sed \'s/%//g\'';

幸运的是,您可以直接执行 df 命令并使用 Perl 命令进行文本处理,这样会容易得多。我会帮助你,但我不确切知道 awk 命令的作用。我猜:

$espace_utilise=`df -h /`;                # get the line
my $df = (split ' ', $espace_utilise)[4]; # get the 5th field
$df =~ s/%//g;                            # remove %. Can also use tr/%d//d

其他错误:

Argument "/dev/mapper/centos-root 50G 5,5G 45G 11 /\n" isn't numeric in numeric lt (<) at check_disque.pl line 55. My line 55 :

...只是因为第一个语句失败了。 Perl 插入 </code> 即使它警告它,它变成空字符串。所以你的 awk 行只是说 <code>{ print },我认为这与打印整行是一样的。所以如果你修复了第一部分,你可以忽略这个。