BashのQueryStringからの連想配列は?
-
21-12-2019 - |
質問
クエリ文字列からBashの連想配列を取得する方法は? - 試み:
#!/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]"
. 解決
は機能するはずです:
#!/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
.
説明:
awkコマンドの組み合わせを使用して文字列を最初に個々のレコードに分割し、次にkvペアの=標識に分割します。
プロセス置換をここに使用しています
編集:
グローバル変数を使用して配列を配列します。
他のヒント
#!/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"
.
上記の's/&/\n/g'
は、sed
のすべての出現を新しい行に置き換える&
コマンドです。すべてのパラメータの割り当てが別の行にあるように、これをq0
に適用します。その後、Parameter Assignmentsがwhile
ループに読み込まれます。各割り当てを読むには、IFS== read key value
が使用されます。 IFS==
は、単語区切り文字として等号を扱うようにread
に指示します。したがって、各割り当ては2つの単語に分割されます。最初はキーであり、2番目は値です。次に、これらは文querydict
を指定して連想配列querydict["$key"]="$value"
に割り当てられます。
関数に入れる
bash
は、複雑なデータを機能に渡すための機能が非常に限られているという点で、最新のプログラミング言語とは異なります。次に示す方法では、連想配列、querydict
はグローバル変数です。
#!/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"
. @ john1024の回答私はそれをvalueによって連想配列を返す関数でそれを使用して、配列構文を使用して内容を印刷するだけです:
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}" )
. 所属していません StackOverflow