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 中的 Options
和 DefaultParser
,则通常期望参数前面有横线。如果你省略了横线,解析库可能无法正确识别参数。
总的来说,具体是否需要在参数前面加横线取决于你使用的命令行解析库和程序的设计要求。在上述示例中,-f
是一个短选项,符合通常的命令行风格。