Assoziatives Array aus Querystring in Bash?
-
21-12-2019 - |
Frage
Wie erhalte ich ein assoziatives Array aus einer Abfragezeichenfolge in Bash?- Versuchen:
#!/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]"
Lösung
Im Folgenden sollte funktionieren:
generasacodicetagpre.Erläuterung:
Ich unter Verwendung einer Kombination von awk-Befehlen, um zuerst die Zeichenfolge in einzelne Datensätze aufzuteilen, dann auf das Zeichen für das KV-Paar aufzuteilen.
Ich verwende hier Process-Substitution hier, andernfalls würde ich eine Kopie des Arrays füllen.
edit:
Verwenden einer globalen Variablen an das Haus-Array.
Andere Tipps
#!/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 obigem, 's/&/\n/g'
ist ein sed
Befehl, der jedes Vorkommen von ersetzt &
mit einer neuen Zeile.Wir wenden dies an q0
sodass jede Parameterzuweisung in einer separaten Zeile steht.Anschließend werden die Parametrierungen in das eingelesen while
Schleife.Um jede Aufgabe zu lesen, IFS== read key value
wird eingesetzt. IFS==
erzählt read
das Gleichheitszeichen als Worttrennzeichen zu behandeln.Daher ist jede Aufgabe in zwei Wörter unterteilt:Der erste ist der Schlüssel und der zweite ist der Wert.Diese werden dann dem assoziativen Array zugeordnet querydict
mit der Aussage querydict["$key"]="$value"
.
Fügen Sie es in eine Funktion ein
bash
unterscheidet sich von den meisten modernen Programmiersprachen dadurch, dass seine Möglichkeiten zur Übergabe komplexer Daten an und aus Funktionen äußerst begrenzt sind.In der unten gezeigten Methode ist das assoziative Array querydict
, ist eine globale Variable:
#!/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"
Einnahme @ John1024-Antwort Ich verwende es in einer Funktion, in der das assoziative Array nach Wert zurückgibt, einfach den Inhalt mithilfe der Array-Syntax ausdrucken:
generasacodicetagpre.