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将等号视为单词分隔符。因此,每个分配都分为两个词:第一个是键,第二个是值。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 回答