实现键值反序列化或类似的东西

实现键值反序列化或类似的东西

我想知道如何最好地实现一个参数$x,比如说$7——我的意思是参数丰富的函数的最后一个参数——这将充当“将各种关键数据放在这里以停止添加更多参数”?可能的调用可能是:afunction param1 param2 ... "MYDATA=1 OTHERDATA=true"。我需要将一些数据上的一堆简单标记传递给函数,并且不需要为它们保留位置参数,特别是因为某些标记是可选的,不能分配给函数签名中的固定位置。

更新: Zsh 解决方案示例可以是:afunc ...normal parameters... "MYDATA:1:OTHERDATA:2:"然后:local mydata="${7/(#b)*MYDATA:([^:]#):*/$match[1]}"。我可以编写一个函数来隐藏复杂的模式代码,它的工作原理如下get_key "$7" "MYDATA"; local mydata=$REPLY:该解决方案有效,但我真的想研究这个并找到以特定方式最好或有用的解决方案。

答案1

使用循环和 处理(其余)参数shift。对于KEY=VALUE类型参数,类似这样(在 bash 中):

function foo {
    shift      # handle the first "fixed" arg  
    while [ -n "$1" ] ; do
        key=${1%%=*}
        val=${1#*=}
        echo "key: $key value: $val"
        shift   
    done    
}              
foo first MYDATA=2 OTHERDATA=false

或者,您可以使用getopts(bash 内置)来解析-x样式标志:

function bar {
    OPTIND=3   # skip first two args
    local opt
    while getopts "ab:" opt; do
        if [ "$opt" = "a" ] ; then
            echo flag -a encountered
        elif [ "$opt" = "b" ] ; then
            echo flag -b with arg $OPTARG
        fi
    done
}

bar fixed args -a -b foo

相关内容