¿Matriz asociativa de cadena de consulta en bash?
-
21-12-2019 - |
Pregunta
¿Cómo obtengo una matriz asociativa a partir de una cadena de consulta en Bash?- Intentar:
#!/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]"
Solución
a continuación debe funcionar:
#!/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
Explicación:
Im Uso de una combinación de comandos AWK para dividir la cadena en los registros individuales primero, luego dividirse en el signo= al par de kv.
Estoy usando la sustitución de procesos aquí, de lo contrario, estaría poblando una copia de la matriz.
Editar:
utilizando una variable global a la matriz de alojamiento.
Otros consejos
#!/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"
En lo anterior, 's/&/\n/g'
es un sed
comando que reemplaza cada aparición de &
con una nueva línea.Aplicamos esto a q0
de modo que cada parametrización esté en una línea separada.A continuación se leen las parametrizaciones en el while
bucle.Para leer cada tarea, IFS== read key value
se utiliza. IFS==
dice read
tratar el signo igual como un separador de palabras.Así, cada tarea se divide en dos palabras:la primera es la clave y la segunda es el valor.Luego se asignan a la matriz asociativa. querydict
con la declaración querydict["$key"]="$value"
.
Poniéndolo en una función
bash
Se diferencia de la mayoría de los lenguajes de programación modernos en que sus posibilidades para pasar datos complejos dentro y fuera de funciones son extremadamente limitadas.En el método que se muestra a continuación, la matriz asociativa, querydict
, es una variable global:
#!/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"
Tomando la respuesta de @ John1024 I Lo uso en una función que devuelve la matriz asociativa por valor, simplemente imprimiendo los contenidos con Sintaxis de 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}" )