Question

Comment puis-je obtenir un tableau associatif à partir d'une chaîne de requête dans le Bash?- Tentative:

#!/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]"
Était-ce utile?

La solution

ci-dessous devrait fonctionner:

#!/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

Explication:

IM à l'aide d'une combinaison de commandes AWK pour fractionner la chaîne en enregistrements individuels en premier, puis divisez-le sur le signe= signe de kv.

J'utilise la substitution de processus ici sinon je vais remplir une copie du tableau.

EDIT:

Utilisation d'une variable globale pour la matrice de maison.

Autres conseils

#!/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"

Ci-dessus, 's/&/\n/g' est un sed commande qui remplace chaque occurrence de & avec une nouvelle ligne.Nous l'appliquons à q0 de sorte que chaque assignation de paramètre est sur une ligne distincte.Le paramètre attributions sont ensuite lues dans l' while de la boucle.À lire chaque mission, IFS== read key value est utilisée. IFS== dit read pour traiter le signe égal comme un séparateur de mots.Ainsi, chaque mission est divisée en deux mots:la première est la clé et la seconde est la valeur.Ce sont ensuite affectés au tableau associatif querydict avec la déclaration de querydict["$key"]="$value".

Le mettre dans une fonction

bash diffère de la plupart des langages de programmation modernes dans ses installations pour la transmission de données complexes dans et hors de fonctions sont extrêmement limitées.Dans la méthode illustrée ci-dessous, le tableau associatif, querydict, est une variable 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"

Réponse de @ John1024 Je l'utilise dans une fonction qui retourne la matrice associative par valeur, imprimez simplement le contenu à l'aide de la syntaxe de tableau:

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}" )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top