You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:36:03