我有一个这样的 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 编码值的方法)
对于感兴趣的人,此代码解析 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)"