Я пытаюсь использовать 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";
}