如何在Kotlin CLI工具中解析形如-i xxx的命名命令行参数?
方案一:使用成熟第三方库(推荐)
Kotlin生态有多个专门处理CLI参数解析的库,可直接生成结构化的参数对象,也支持导出键值对结构,无需手动处理字符串拆分逻辑。
1. kotlinx.cli(JetBrains官方出品)
这是Kotlin官方维护的多平台CLI解析库,轻量且对Kotlin特性适配性好。
使用示例:
import kotlinx.cli.ArgParser import kotlinx.cli.ArgType import kotlinx.cli.required fun main(args: Array<String>) { val parser = ArgParser("your-cli-tool") val input by parser.option(ArgType.String, shortName = "i", description = "Input file path").required() val verbose by parser.option(ArgType.Boolean, shortName = "v", description = "Enable verbose log").default(false) parser.parse(args) // 可直接转成Map使用 val paramMap = mapOf("i" to input, "v" to verbose) println(paramMap) }
2. Clikt
功能更丰富的Kotlin CLI库,支持子命令、自动补全、帮助信息自动生成、参数校验等进阶需求,适合复杂CLI工具开发。
使用示例:
import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.parameters.options.option import com.github.ajalt.clikt.parameters.options.flag import com.github.ajalt.clikt.parameters.options.required class MyCli : CliktCommand() { val input: String by option("-i", help = "Input file path").required() val verbose: Boolean by option("-v", help = "Enable verbose log").flag(default = false) override fun run() { val paramMap = mapOf("i" to input, "v" to verbose) println(paramMap) } } fun main(args: Array<String>) = MyCli().main(args)
方案二:手动实现极简参数解析
如果你的需求非常简单,不想引入额外依赖,可自己遍历args数组实现解析,核心逻辑如下:
- 遍历参数数组,识别以
-/--开头的字符串作为参数键 - 若下一个元素不是以
-开头,则作为当前键对应的值,否则当前键为无值标记参数,默认值设为true - 最终输出键值对Map
简易实现代码:
fun main(args: Array<String>) { val paramMap = mutableMapOf<String, Any>() var i = 0 while (i < args.size) { val arg = args[i] if (arg.startsWith("-")) { val key = arg.trimStart('-') // 检查下一个元素是否是参数值 if (i + 1 < args.size && !args[i+1].startsWith("-")) { paramMap[key] = args[i+1] i += 2 } else { // 无值标记参数 paramMap[key] = true i += 1 } } else { // 处理位置参数,可自行存入单独列表使用 i += 1 } } // 直接使用解析后的Map println(paramMap["i"]) // 对应输入示例中的input.mp4 }
该实现仅覆盖基础命名参数场景,如需支持短参数合并、--key=value格式等进阶规则,可基于上述逻辑扩展
内容的提问来源于stack exchange,提问作者sn0ep
相关产品推荐
相关产品推荐

