我正在尝试使用Getopt::Long向我的脚本添加命令行参数(如下所示)。我遇到的问题与多个执行不同操作的命令有关。例如,我有一个选项标志,用于设置要与脚本一起使用的配置文件-c [config_path]
,我也有-h
的帮助。
我遇到的问题是我需要一个条件,说明是否已使用配置选项并且已指定配置文件。我尝试计算@ARGV
中的选项,但发现如果指定了-h
和-c
,则会导致脚本继续移动到子例程load_config
。因为如下面的代码所示,当@ARGV
中找到2个参数时,它会触发子例程。
我能以什么方式解决这个问题?至少在我脑海中同时指定-h
和-c
时,它们相互矛盾。有没有办法让它变成只有像-c
这样的“操作命令”才能执行像帮助这样的“信息命令”?哎呀有一种方法可以获得已经传递的命令列表吗?我尝试打印@ARGV
的内容,但即使我已经指定了命令参数,也没有任何内容。
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Term::ANSIColor;
use XML::Simple;
use Net::Ping;
use Net::OpenSSH;
use Data::Dumper;
# Create a new hash to copy XML::Simple configuration file data into
my %config_file;
# Clear the screen and diplay version information
system ("clear");
print "Solignis's Backup script v0.8 for ESX\\ESX(i) 4.0+\n";
print "Type -h or --help for options\n\n";
# Create a new XML::Simple object
my $xml_obj = XML::Simple->new();
# Create a new Net::Ping object
my $ping_obj = Net::Ping->new();
my $config_file;
my $argcnt = $#ARGV + 1;
GetOptions('h|help' => \&help,
'c|config=s' => \$config_file
);
if ($argcnt == 0) {
print "You must supply a config to be used\n";
} elsif ($argcnt == 2) {
if (! -e $config_file) {
print color 'red';
print "Configuration file not found!\n";
print color 'reset';
print "\n";
die "Script Halted\n";
} else {
load_config();
}
}
sub load_config {
print color 'green';
print "$config_file loaded\n";
print color 'reset';
my $xml_file = $xml_obj->XMLin("$config_file",
SuppressEmpty => 1);
foreach my $key (keys %$xml_file) {
$config_file{$key} = $xml_file->{$key};
}
print Dumper (\%config_file);
}
sub help {
print "Usage: backup.pl -c [config file]\n";
}
答案 0 :(得分:8)
@ARGV被GetOptions改变,这就是为什么它似乎是空的。而不是计算参数,只需直接检查是否定义了$config_file
。
BTW,IMO无需尝试排除-c
与-h
一起使用。通常情况下,“帮助”只会打印帮助文本并退出而不采取任何其他操作,请先检查一下,是否提供-c
无关紧要。
答案 1 :(得分:3)
像
这样的东西my $help;
my $config_file;
GetOptions('h|help' => \$help,
'c|config=s' => \$config_file
);
if ( defined $help ) {
help();
} elsif ( defined $config_file ) {
...;
} else {
die "No arguments!";
}
答案 2 :(得分:0)
您可能还想查看Getopt::Euclid,它提供了一些提供选项的扩展方法,以及使用程序文档作为命令行参数规范的一种很酷的方法。
答案 3 :(得分:0)
您始终可以为选项设置默认值,例如my $help = 0; my $config_file = "";
,然后测试这些值。