scala解析命令行参数详解

如何用scala解析命令行参数:

首先,需要在项目中添加Apache Commons CLI库的依赖。可以在pom.xml中加,

也可以在build.sbt文件中添加如下行:

libraryDependencies += "commons-cli" % "commons-cli" % "1.4"

下面是一个解析命令行参数的简单例子:

import org.apache.commons.cli.{Options, CommandLineParser, DefaultParser, HelpFormatter, ParseException}

object CommandLineParserExample {

  def main(args: Array[String]): Unit = {
    // 创建Options对象,用于存储命令行选项
    // 第一二个参数分别代表参数的短名和长名字,都可以匹配,第三个参数是是否接受参数
    // 比如只接受参数名不接受参数 例如-help
    val options = new Options()
    options.addOption("h", "help", false, "显示帮助信息")
    options.addOption("f", "file", true, "指定文件路径")

    // 创建命令行解析器
    val parser: CommandLineParser = new DefaultParser()

    try {
      // 解析命令行参数
      val cmd = parser.parse(options, args)

      // 检查是否包含帮助选项
      if (cmd.hasOption("h")) {
        printHelp(options)
      } else {
        // 获取文件路径选项的值
        val filePath = cmd.getOptionValue("f")
        println(s"指定的文件路径是:$filePath")
      }
    } catch {
      case e: ParseException =>
        println(s"解析命令行参数时发生错误:${e.getMessage}")
        printHelp(options)
    }
  }

  // 显示帮助信息
  def printHelp(options: Options): Unit = {
    val formatter = new HelpFormatter()
    formatter.printHelp("CommandLineParserExample", options)
  }
}

 还有另一种写法:(这边会演示你命令行需要传什么样的参数进去)

import org.apache.commons.cli.{CommandLine, DefaultParser, Options, Option, ParseException}

object CommandLineParser {
  def main(args: Array[String]): Unit = {
    val options = new Options()

    options.addOption(Option.builder("f")
      .longOpt("foo")
      .desc("foo is an integer property")
      .hasArg()
      .argName("foo")
      .build())

    options.addOption(Option.builder("b")
      .longOpt("bar")
      .desc("bar is a string property")
      .hasArg()
      .argName("bar")
      .build())

    options.addOption(Option.builder("z")
      .longOpt("baz")
      .desc("baz is a boolean property")
      .build())

    val parser = new DefaultParser()
    try {
      val cmd: CommandLine = parser.parse(options, args)

      val fooValue = if (cmd.hasOption("f")) cmd.getOptionValue("f").toInt else -1
      val barValue = if (cmd.hasOption("b")) cmd.getOptionValue("b") else ""
      val bazValue = cmd.hasOption("z")

      val config = Config(fooValue, barValue, bazValue)
      // Do something with the parsed configuration
      println(config)
    } catch {
      case e: ParseException =>
        // Handle parsing exception
        println("Error parsing command line: " + e.getMessage)
    }
  }

  case class Config(foo: Int = -1, bar: String = "", baz: Boolean = false)
}

在这个例子中,args 参数是一个 String[],表示命令行传递给程序的参数。parser.parse(options, args) 方法将解析这些参数并返回一个 CommandLine 对象,你可以通过它来获取每个选项的值。

例如,你可以在命令行运行程序并传递参数:

java -jar YourApp.jar -f 42 -b "example" -z

后面跟的就是一个数组

在这个例子中,args 数组将包含 ["-f", "42", "-b", "example", "-z"]parser.parse(options, args) 将解析这些参数,并你可以使用 cmd.getOptionValue("f") 等方法获取相应选项的值。

参数应该传什么样的,参数名前面一定要加 “-”?

在常见的命令行规范中,命令行参数通常使用短选项(short options)和长选项(long options)。短选项通常由一个短横线 - 后跟一个单个字母组成,而长选项则由两个短横线 -- 后跟一个或多个字母、数字或横线组成。

例如,在以下命令中:

scala CommandLineParserExample.scala -f /path/to/file.txt

-f 就是一个短选项,表示后面将提供一个文件路径。短选项通常用于单个字符的标识,而长选项则用于更具描述性的标识。

在某些情况下,参数可能不需要前缀横线。这取决于你的命令行解析库和程序的要求。有些库允许在参数前面使用横线,有些则不允许。通常,使用横线是为了明确表示这是一个选项而不是参数值。

例如,如果使用的是 Apache Commons CLI 中的 OptionsDefaultParser,则通常期望参数前面有横线。如果你省略了横线,解析库可能无法正确识别参数。

总的来说,具体是否需要在参数前面加横线取决于你使用的命令行解析库和程序的设计要求。在上述示例中,-f 是一个短选项,符合通常的命令行风格。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后季暖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值