如何在为标志指定特定顺序的同时,使用ARGV传递命令行标志?

ian*_*215 0 perl argv

我想将ARGV的使用集成到我的脚本中.在弄乱我在Stack Overflow上发现的一个简单用法示例后,我能够使脚本"强制"使用单个命令args.我现在想要的是允许多个标志而不是一个.如果有多个使用的标记,则需要按特定顺序强制执行标记.

以下是我为实现单个args并执行它而编写的代码.

#!/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";
}
Run Code Online (Sandbox Code Playgroud)

Can*_*ice 5

使用核心Getopt::Long模块,不要担心自己解析参数.

如果你有多个参数,而不是按照他们说的顺序做任何他们说的话,你只需执行类似下面的伪代码:

if( option s is set ) {
  run setup stuff
}
if( option b is set ) {
  run backup stuff
}
Run Code Online (Sandbox Code Playgroud)

绝对没有理由为什么你的脚本应该允许参数作为-s -b和不-b -s.您的用户将希望,如果他们提供的-b -s设置将首先完成,然后备份.你的脚本应该足够聪明.