Как я могу передать флаги командной строки с ARGV при указании определенного порядка для флагов? - PullRequest
0 голосов
/ 20 января 2011

Я хочу интегрировать использование ARGV в мой скрипт.После работы с примером простого использования, которое я нашел в Stack Overflow, я смог заставить скрипт «принудительно» использовать аргументы одной команды.Теперь я хочу разрешить использовать несколько флагов вместо одного.Подвох - это флаги, которые нужно применять в определенном порядке, если используются несколько.

Вот код, который я придумал для выполнения отдельных аргументов и его применения.

#!/usr/bin/perl
use strict;
use warnings;

system ("clear");
print "Solignis's Discovery Script v0.6 for ESX\\ESX(i) 4.0+\n\n";

my $numargs = $#ARGV + 1;

if ($#ARGV < 0) {
    help_menu();
}

foreach my $argval (0 .. $#ARGV) {
    if (($#ARGV == 0) && ($ARGV[0] eq '-b')) {
        print "Backup\n";
    } elsif (($#ARGV == 0) && ($ARGV[0] eq '-d')) {
        print "Discovery\n";
    } elsif ((($#ARGV == 0) && ($ARGV[0] eq '-h') || ($#ARGV == 0) && ($ARGV[0] eq '-?'))) {
        help_menu();
    } elsif (($#ARGV == 0) && ($ARGV[0] eq '-s')) {
        print "Setup\n"
    }
}

if ($#ARGV >= 1) {
    print "Too many arguments, only one argument may be passed at a time!\n";
}

sub help_menu {
    print "Options:\n\n";
    print "\t-b\tRun Backup Backup\n";
    print "\t-d\tRun Discovery Script\n";
    print "\t-h\tShow Help Menu\n";
    print "\t-s\tRun Setup Script\n\n";
}

1 Ответ

5 голосов
/ 20 января 2011

Используйте базовый Getopt::Long модуль и не беспокойтесь о синтаксическом анализе аргументов самостоятельно.

Если у вас есть несколько аргументов, вместо того, чтобы делать то, что они говорят в том порядке, в котором они говорят,вы просто делаете что-то вроде следующего псевдокода:

if( option s is set ) {
  run setup stuff
}
if( option b is set ) {
  run backup stuff
}

Нет абсолютно никаких причин, почему ваш скрипт должен разрешать аргументы как -s -b, а не -b -s.Ваши пользователи будут ожидать, что если они предоставят -b -s, то сначала будет выполнена настройка, а затем резервное копирование.Ваш сценарий должен быть достаточно умным.

...