Implementa uma desserialização de valor-chave ou algo semelhante [fechado]

0

Eu estou querendo saber como implementar melhor um parâmetro $x , digamos $7 - quero dizer, um último parâmetro para uma função rica em parâmetros - que serviria para "colocar aqui vários dados-chave para parar de adicionar mais parâmetros "? A possível ligação poderia ser: afunction param1 param2 ... "MYDATA=1 OTHERDATA=true" . É que preciso passar várias marcas simples em alguns dados para uma função e não preciso de parâmetros posicionais reservados para eles, especialmente porque algumas das marcas são opcional e não pode ser atribuído a uma posição fixa na assinatura da função.

ATUALIZAÇÃO: Exemplo de solução Zsh poderia ser: afunc ...normal parameters... "MYDATA:1:OTHERDATA:2:" e depois: local mydata="${7/(#b)*MYDATA:([^:]#):*/$match[1]}" . Eu poderia escrever uma função para esconder o código de padrão complexo, funcionaria como: get_key "$7" "MYDATA"; local mydata=$REPLY . Essa solução funciona, mas eu realmente quero pesquisar isso e encontrar uma solução melhor ou útil de uma maneira específica.

    
por Itzie 05.09.2016 / 23:03

1 resposta

3

Manipule os argumentos (restantes) com um loop e shift . Para KEY=VALUE type argumentos, algo assim (no 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

Você também pode usar getopts (bash builtin) para analisar -x style flags:

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
    
por 06.09.2016 / 00:07