欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

【译文】CLI使用介绍
(last modified Jun 26, 2023, 2:04 PM )
by
侧边栏壁纸
  • 累计撰写 185 篇文章
  • 累计创建 65 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

【译文】CLI使用介绍

橙序员
2022-08-07 / 0 评论 / 0 点赞 / 471 阅读 / 2,051 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

以下部分描述了一些有关如何在应用程序中使用 CLI 的示例场景。使用一个boolean选项布尔选项在命令行上由选项的存在表示,即如果找到选项,则选项值为true,否则值为false。DateApp 实用程序将当前日期打印到标准输出。 如果存在 -t 选项,则还会打印当前时间。创建选项创建选项对象并添

以下部分描述了一些有关如何在应用程序中使用 CLI 的示例场景。

使用一个boolean选项

布尔选项在命令行上由选项的存在表示,即如果找到选项,则选项值为true,否则值为false

DateApp 实用程序将当前日期打印到标准输出。 如果存在 -t 选项,则还会打印当前时间。

创建选项

创建选项对象并添加选项:

// create Options object
Options options = new Options();

// add t option
options.addOption("t", false, "display current time");

addOption 方法有三个参数。 第一个参数是代表选项的 java.lang.String。 第二个参数是一个布尔值,指定选项是否需要参数。 在布尔选项(有时称为标志)的情况下不存在参数值,因此传递了 false。 第三个参数是选项的描述。 此描述将在应用程序的使用文本中使用。

解析命令行参数

CommandLineParser 的解析方法用于解析命令行参数。 CommandLineParser 接口可能有多种实现,推荐的一种是 DefaultParser

CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);

现在我们需要检查 t 选项是否存在。 为此,我们将询问 CommandLine 对象。 hasOption 方法接受一个 java.lang.String 参数,如果存在 java.lang.String 表示的选项,则返回 true,否则返回 false。

if(cmd.hasOption("t")) {
    // print the date and time
}
else {
    // print the date
}

笔记。
从 1.5 版开始,DefaultParser 的构造函数现在具有签名 DefaultParser(final boolean allowPartialMatching) 的覆盖。 给定以下代码:

final Options options = new Options();
options.addOption(new Option("d", "debug", false, "Turn on debug."));
options.addOption(new Option("e", "extract", false, "Turn on extract."));
options.addOption(new Option("o", "option", true, "Turn on option with argument."));

我们将“部分匹配”定义为 -de 仅匹配“调试”选项。 因此,我们现在可以关闭它并让 -de 匹配调试选项和提取选项。

国际时间

InternationalDateApp 实用程序通过提供打印世界上任何国家/地区的日期和时间的能力来扩展 DateApp 实用程序。 为了促进这一点,引入了一个新的命令行选项 c。

// add c option
options.addOption("c", true, "country code");

这次第二个参数为真。 这指定 c 选项需要一个参数值。 如果在命令行上指定了所需的选项参数值则返回,否则返回 null。

检索参数值

CommandLine 的 getOptionValue 方法用于检索选项的参数值。

// get c option value
String countryCode = cmd.getOptionValue("c");

if(countryCode == null) {
    // print default date
}
else {
    // print date for country specified by countryCode
}

以 Ant 为例

这里将使用 Ant 来说明如何创建所需的 Options。 以下是 Ant 的帮助输出。

ant [options] [target [target2 [target3] ...]]
  Options: 
  -help                  print this message
  -projecthelp           print project help information
  -version               print the version information and exit
  -quiet                 be extra quiet
  -verbose               be extra verbose
  -debug                 print debugging information
  -emacs                 produce logging information without adornments
  -logfile <file>        use given file for log
  -logger <classname>    the class which is to perform logging
  -listener <classname>  add an instance of class as a project listener
  -buildfile <file>      use given buildfile
  -D<property>=<value>   use value for given property
  -find <file>           search for buildfile towards the root of the
                         filesystem and use it

定义布尔选项

让我们为应用程序创建布尔选项,因为它们最容易创建。 为清楚起见,此处使用了 Option 的构造函数。

Option help = new Option("help", "print this message");
Option projecthelp = new Option("projecthelp", "print project help information");
Option version = new Option("version", "print the version information and exit");
Option quiet = new Option("quiet", "be extra quiet");
Option verbose = new Option("verbose", "be extra verbose");
Option debug = new Option("debug", "print debugging information");
Option emacs = new Option("emacs",
                           "produce logging information without adornments");

定义参数选项

参数选项是使用 Option#Builder 创建的。

Option logfile   = Option.builder("logfile")
                         .argName("file")
                         .hasArg()
                         .desc("use given file for log")
                         .build();

Option logger    = Option.builder("logger")
                         .argName("classname")
                         .hasArg()
                         .desc("the class which it to perform logging")
                         .build();

Option listener  = Option.builder("listener")
                         .argName("classname")
                         .hasArg()
                         .desc("add an instance of class as "
                                + "a project listener")
                         .build();

Option buildfile = Option.builder("buildfile")
                         .argName("file")
                         .hasArg()
                         .desc("use given buildfile")
                         .build();

Option find      = Option.builde("find")
                         .argName("file")
                         .hasArg()
                         .desc("search for buildfile towards the "
                                + "root of the filesystem and use it")
                         .build();

定义 Java 属性选项

最后一个创建选项是 Java 属性,它也是使用 OptionBuilder 创建的。

Option property  = Option property  = Option.builder("D")
                                .hasArgs()
                                .valueSeparator('=')
                                .build();

稍后可以通过在命令行上调用 getOptionProperties(“D”) 来检索此选项指定的属性映射。

创建选项

现在我们已经创建了每个选项,我们需要创建选项实例。 这是使用 Options 的 addOption 方法实现的

Options options = new Options();

options.addOption(help);
options.addOption(projecthelp);
options.addOption(version);
options.addOption(quiet);
options.addOption(verbose);
options.addOption(debug);
options.addOption(emacs);
options.addOption(logfile);
options.addOption(logger);
options.addOption(listener);
options.addOption(buildfile);
options.addOption(find);
options.addOption(property);

现在所有准备工作都完成了,我们现在可以解析命令行参数了。

创建解析器

我们现在需要创建一个 CommandLineParser。 这将使用 Options 指定的规则解析命令行参数并返回 CommandLine 的实例。

public static void main(String[] args) {
    // create the parser
    CommandLineParser parser = new DefaultParser();
    try {
        // parse the command line arguments
        CommandLine line = parser.parse(options, args);
    }
    catch (ParseException exp) {
        // oops, something went wrong
        System.err.println("Parsing failed.  Reason: " + exp.getMessage());
    }
}

查询命令行

要查看是否已传递选项,请使用 hasOption 方法。 可以使用 getOptionValue 方法检索参数值。

// has the buildfile argument been passed?
if(line.hasOption("buildfile")) {
    // initialise the member variable
    this.buildfile = line.getOptionValue("buildfile");
}

显示用法和帮助

CLI 还提供了自动生成使用和帮助信息的方法。 这是通过 HelpFormatter 类实现的。

// automatically generate the help statement
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("ant", options);

执行时会产生以下输出:

usage: ant
-D <property=value>     use value for given property
-buildfile <file>       use given buildfile
-debug                  print debugging information
-emacs                  produce logging information without adornments
-file <file>            search for buildfile towards the root of the
                        filesystem and use it
-help                   print this message
-listener <classname>   add an instance of class as a project listener
-logger <classname>     the class which it to perform logging
-projecthelp            print project help information
-quiet                  be extra quiet
-verbose                be extra verbose
-version                print the version information and exit

如果您还需要打印使用说明,则调用 formatter.printHelp(“ant”, options, true) 将生成使用说明以及帮助信息。

创建一个 ls 示例

*nix 世界中使用最广泛的命令行应用程序之一是 ls。 由于 ls 需要大量选项,本示例仅涵盖一小部分选项。 以下是帮助输出的一部分。

Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuSUX nor --sort.

-a, --all                  do not hide entries starting with .
-A, --almost-all           do not list implied . and ..
-b, --escape               print octal escapes for non-graphic characters
    --block-size=SIZE      use SIZE-byte blocks
-B, --ignore-backups       do not list implied entries ending with ~
-c                         with -lt: sort by, and show, ctime (time of last
                           modification of file status information)
                           with -l: show ctime and sort by name
                           otherwise: sort by ctime
-C                         list entries by columns

以下是用于为此示例创建选项的代码。

// create the command line parser
CommandLineParser parser = new DefaultParser();

// create the Options
Options options = new Options();
options.addOption("a", "all", false, "do not hide entries starting with .");
options.addOption("A", "almost-all", false, "do not list implied . and ..");
options.addOption("b", "escape", false, "print octal escapes for non-graphic "
                                         + "characters");
options.addOption(Option.builder("SIZE").longOpt("block-size")
                                .desc("use SIZE-byte blocks")
                                .hasArg()
                                .build());
options.addOption("B", "ignore-backups", false, "do not list implied entries "
                                                 + "ending with ~");
options.addOption("c", false, "with -lt: sort by, and show, ctime (time of last " 
                               + "modification of file status information) with "
                               + "-l:show ctime and sort by name otherwise: sort "
                               + "by ctime");
options.addOption("C", false, "list entries by columns");

String[] args = new String[]{ "--block-size=10" };

try {
    // parse the command line arguments
    CommandLine line = parser.parse(options, args);

    // validate that block-size has been set
    if (line.hasOption("block-size")) {
        // print the value of block-size
        System.out.println(line.getOptionValue("block-size"));
    }
}
catch (ParseException exp) {
    System.out.println("Unexpected exception:" + exp.getMessage());
}
0

评论区