Domanda

Come posso ottenere un array associativo da una stringa di query in bash?- Tentativo:

#!/usr/bin/env bash

# Querystring (implementation stolen from http://stackoverflow.com/q/3919755)

function populate_querystring_array ()
{
    param="$1"
    query_dict="$2"
    #for i in "${array[@]}"; do IFS="=" ; set -- $i; query_dict[$1]=$2; done

    for ((i=0; i<${#param[@]}; i+=2))
    do
        query_dict[${param[i]}]=${param[i+1]}
    done
}

q0='email=foo@bar.com&password=dfsa54'
declare -A querydict
populate_querystring_array "$q0" "$querydict"
printf "$querydict[email]"
.

È stato utile?

Soluzione

Di seguito dovrebbe funzionare:

#!/bin/bash

function qrystring() {
    qry=$1

    while read key value; do
        arr+=(["$key"]="$value")
    done < <(awk -F'&' '{for(i=1;i<=NF;i++) {print $i}}' <<< $qry | awk -F'=' '{print $1" "$2}')
}

q='email=foo@bar.com&password=dfsa54'
declare -A arr

qrystring "$q"

for k in ${!arr[@]}; do
    echo "$k -> ${arr[$k]}"
done
.

Spiegazione:

IM Uso di una combinazione di comandi AWK per dividere prima la stringa in singoli record, quindi dividere il segno= Sign per la coppia KV.

Sto usando la sostituzione del processo qui altrimenti vorrei popolare una copia dell'array.

Modifica:

Utilizzo di una variabile globale per la matrice di casa.

Altri suggerimenti

#!/usr/bin/env bash
q0='email=foo@bar.com&password=dfsa54'
declare -A querydict
while IFS== read key value
do
    querydict["$key"]="$value"
done < <(echo "$q0" | sed 's/&/\n/g' )
printf "${querydict[email]}\n"
.

In quanto sopra, 's/&/\n/g' è un comando sed che sostituisce ogni occorrenza di & con una nuova riga. Applichiamo questo a q0 in modo che ogni assegnazione dei parametri sia su una linea separata. Le assegnazioni dei parametri vengono quindi lette nel loop while. Per leggere ogni assegnazione, viene utilizzato IFS== read key value. IFS== dice read a trattare il segno uguale come separatore di parole. Pertanto, ogni incarico è suddiviso in due parole: il primo è la chiave e il secondo è il valore. Questi vengono quindi assegnati all'array associativo querydict con l'istruzione querydict["$key"]="$value".

mettendolo in una funzione

bash differisce dalla maggior parte dei linguaggi di programmazione moderni in quanto le sue strutture per il passaggio di dati complessi e fuori funzioni sono estremamente limitati. Nel metodo mostrato di seguito, l'array associativo, querydict, è una variabile globale:

#!/usr/bin/env bash
declare -A querydict
populate_querystring_array () {
    query="$1"
    while IFS== read arg value
    do 
        querydict["$arg"]="$value"
    done < <(echo "$query" | sed 's/&/\n/g' )
}

q0='email=foo@bar.com&password=dfsa54'
populate_querystring_array "$q0"
printf "${querydict[email]}\n"
.

Assunzione di @ John1024 La risposta lo uso in una funzione che restituisce l'array associativo per valore, è sufficiente stampare il contenuto utilizzando la sintassi dell'array:

function parseQuery {
    local querystring="$*"
    echo -n "("
    echo "${querystring}" | sed 's/&/\n/g' | while IFS== read arg value
    do
        echo -n "[${arg}]='${value}' "
    done
    echo ")"
}

declare -A querydict=$(parseQuery "${QUERY_STRING}" )
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top