Tableau associatif de querystring en bash?
-
21-12-2019 - |
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]"
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.
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}" )