2

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]"
4

3 に答える 3

2
#!/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て、すべてのパラメーター割り当てが別の行にあるようにします。while次に、パラメーターの割り当てがループに読み込まれます。各割り当てを読み取るには、IFS== read key valueを使用します。 等号を単語区切りとして扱うようにIFS==指示します。readしたがって、各割り当ては 2 つの単語に分割されます。1 つ目はキーで、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"
于 2014-02-25T08:46:04.910 に答える
1

以下は動作するはずです:

#!/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 ペアの = 記号で分割します。

ここではプロセス置換を使用しています。そうしないと、配列のコピーを作成することになります。

編集:

グローバル変数を使用して配列を格納します。

于 2014-02-25T08:27:28.650 に答える
0

@ John1024の回答を取得して、連想配列を値で返す関数で使用し、配列構文を使用して内容を単純に出力します。

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}" )
于 2016-09-14T14:10:54.213 に答える