如何让脚本运行?

时间:2016-03-29 07:37:49

标签: perl

我在下面编写脚本但是脚本运行结果有错误 "在连接(。)中使用未初始化的值$ bay_name或在test.pl第92行使用字符串。"

#!/usr/bin/env perl

use strict;
use warnings;
use JSON;
use Getopt::Long;
use POSIX qw/strftime/;


## perl time variable
my $dt = strftime('%Y%m%d%H%M%S',localtime);


## Variable reset
my ($key, $value, $bay_name, $dot) = '';
$dot = ' ';

for (`cat test | awk 'NF' | awk /:/ | sed -e 's/  \+/ /g' -e 's/ : /:/g' | egrep "All|Bay|Number"`)
    {
        ($key, $value) = m/(.*?):(.*?)$/g
            or next;

        if ($key eq 'BayName') {
            $bay_name = $value;
        }
        else {
            $key = $bay_name . $dot . $key;
        }

        if ($key eq 'BayName') {
            undef $key;
        }
        else {
        print "\t,\n";
        print "\t{\n";
        print "\t\t\"{#HWNAMES}\":\"$key\",\n";
        print "\t\t\"{#HWSTATUS}\":\"$value\"\n";
        print "\t}\n";
    }
    }

我想修复它

测试文件的内容低于内容

System Bay

  Bay Name                             :    SB-1
  Number of Standby Power Supplies     :    4
  Number of Drive Enclosures           :    0
  Number of Enclosure Slots            :    2
  Number of MIBE Enclosures            :    2

  Summary Status of Contained Modules
    All Standby Power Supplies         :    Normal
    All Enclosures                     :    Normal
    All Link Control Cards             :    Normal
    All Power Supplies                 :    Normal
    All Enclosure Slots                :    Normal
    All Power Supplies                 :    Normal
    All Fans                           :    Normal
    All Management Modules             :    Normal
    All IO Module Carriers             :    Normal
    All Directors                      :    Normal
    All MIBE Enclosures                :    Normal
    All Power Supplies                 :    Normal

Drive Bays

  Bay Name                             :    DB-1A
  Number of Standby Power Supplies     :    8
  Number of Drive Enclosures           :    16

  Summary Status of Contained Modules
    All Enclosures                     :    Normal
    All Link Control Cards             :    Normal
    All Power Supplies                 :    Normal
    All Standby Power Supplies         :    Normal

我想要下面的结果 Bay Name行在输出中被删除 所有内容更改打击格式

    {
            "{#HWNAMES}":"SB-1 All Standby Power Supplies",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Enclosures",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Link Control Cards",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Power Supplies",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Enclosure Slots",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Power Supplies",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Fans",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Management Modules",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All IO Module Carriers",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Directors",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All MIBE Enclosures",
            "{#HWSTATUS}":"Normal"
    },
    {
            "{#HWNAMES}":"SB-1 All Power Supplies",
            "{#HWSTATUS}":"Normal"
    }

以下是我的剧本

for (`/opt/emc/SYMCLI/bin/symcfg -sid $sid list -env_data`) {

        if (/^\s+Bay Name\s+:\s+(\S+)$/){
                $bay_name = $1;

        } elsif (/(Number.*)\s+:\s+(\d+)/){
                print "\t{\n";
                print "\t\t\"{#HWNAMEC}\":\"$bay_name $1\",\n";
                print "\t\t\"{#HWCOUNT}\":\"$2\"\n";
                print "\t},\n";


        } elsif (/(All.*)\s+:\s+(\S+)/) {
                print "\t{\n";
                print "\t\t\"{#HWNAMES}\":\"$bay_name $1\",\n";
                print "\t\t\"{#HWSTATUS}\":\"$2\"\n";
                print "\t},\n";
        }
}

2 个答案:

答案 0 :(得分:1)

不使用所有的shell管道和函数,你可以通过一点perl来实现这一点。

use strict;
use warnings;

my $bay_name;
while (<DATA>) {
    chomp();
    if (/^\s+Bay Name\s+:\s+(\S+)$/){
        $bay_name = $1;
    } elsif (/(Number of Standby Power Supplies)\s+:\s+(\d+)/){
        print "$bay_name $1 : $2\n";
    } elsif (/(All Standby Power Supplies|All Enclosures)\s+:\s+(\S+)/) {
        print "$bay_name $1 : $2\n";
    }
}


__DATA__
System Bay

  Bay Name                             :    SB-1
  Number of Standby Power Supplies     :    4

  Summary Status of Contained Modules
    All Standby Power Supplies         :    Normal

Drive Bays

  Bay Name                             :    DB-1A
  Number of Standby Power Supplies     :    8

  Summary Status of Contained Modules
    All Enclosures                     :    Normal

根据您的示例数据

生成以下输出
SB-1 Number of Standby Power Supplies : 4
SB-1 All Standby Power Supplies : Normal
DB-1A Number of Standby Power Supplies : 8
DB-1A All Enclosures : Normal

答案 1 :(得分:1)

您提出的实际问题通过添加

来解决
my $bay_name;

for循环中。您已启用use strict,这是一种很好的做法,需要声明变量,但不会声明$bay_name,这是错误消息所指的内容。

然而,其他人已经指出从Perl调用管道是完全没必要的,你可以用其他各种方式改进代码。