Zsh: извлечь запрос CGI в ассоциативный массив - PullRequest
1 голос
/ 18 февраля 2009

У меня есть запрос CGI, подобный этому: 'a = 1 & b = 2 & c = 3'.

Я хочу извлечь его в ассоциативный массив A, например, $ A [a] = 1, $ A [b] = 2 и $ [c] = 3.

Я нашел этот способ, но я бы хотел найти более простой (более короткий) способ:

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

(бонус: найдите способ обработки закодированных значений URL)

1 Ответ

1 голос
/ 18 февраля 2009

Для тех, кто заинтересован, этот код анализирует параметры GET и POST и сохраняет их в глобальном ассоциативном массиве 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)"
...