Zsh: Extrahieren eine CGI-Abfrage zu einem assoziativen Array
Frage
Ich habe eine CGI-Abfrage wie folgt:. 'A = 1 & b = 2 & c = 3'
ich will es in einem assoziativen Array extrahieren, wie beispielsweise A $ A [a] = 1, $ A [b] = 2 und $ [c] = 3.
Ich fand diese Art und Weise, aber ich mag einen einfacheren (kürzeren) Weg, um diese finden:
QUERY='a=1&b=2&c=3'
typeset -a T
T=( ${(s:&:)QUERY} )
typeset -A A
A=()
for v in $T; do
A+=( ${(s:=:)v} )
done
(Bonus: einen Weg finden, URL-codierte Werte zu handhaben)
Lösung
Für Interessenten, dieser Code parst GET und POST-Parameter und speichert sie in den globalen assoziativen Arrays QUERY_PARAMETERS.
function parse_query_string()
{
local query="$1"
local -a pairs
pairs=( ${(s:&:)query} )
for v in $pairs; do
QUERY_PARAMETERS+=( ${(s:=:)v} ) # todo: handle parameters without =
done
for name in ${(k)QUERY_PARAMETERS}; do
local value="$QUERY_PARAMETERS[$name]"
QUERY_PARAMETERS[$name]="$(url_decode "$value")"
done
}
function url_decode()
{
setopt extendedglob
local d=${1//\%(#b)([0-F][0-F])/\\\x$match[1]}
d=${d//+/ }
echo "$d"
}
parse_query_string "$QUERY_STRING"
parse_query_string "$(cat)"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow