从 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]"
#!/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
将等号视为单词分隔符。 因此,每个赋值分为两个词:第一个是键,第二个是值。 然后将这些分配给与语句 querydict["$key"]="$value"
querydict
的关联数组。
将其放入函数中
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"
下面应该可以工作:
#!/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 对的 = 符号上拆分。
我在这里使用进程替换,否则我将填充数组的副本。
编辑:
使用全局变量来容纳数组。
取@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}" )