Чтобы обновить это, если у вас последняя версия Bash, вы можете добиться этого с помощью регулярных выражений:
q="$QUERY_STRING"
re1='^(\w+=\w+)&?'
re2='^(\w+)=(\w+)$'
declare -A params
while [[ $q =~ $re1 ]]; do
q=${q##*${BASH_REMATCH[0]}}
[[ ${BASH_REMATCH[1]} =~ $re2 ]] && params+=([${BASH_REMATCH[1]}]=${BASH_REMATCH[2]})
done
Если вы не хотите использовать ассоциативные массивы, просто измените предпоследнюю строку, чтобы сделать то, что вы хотите. Для каждой итерации цикла параметр находится в ${BASH_REMATCH[1]}
, а его значение в ${BASH_REMATCH[2]}
.
Здесь то же самое, что и функция в коротком тестовом скрипте, который перебирает массив и выводит параметры строки запроса и их значения
#!/bin/bash
QUERY_STRING='foo=hello&bar=there&baz=freddy'
get_query_string() {
local q="$QUERY_STRING"
local re1='^(\w+=\w+)&?'
local re2='^(\w+)=(\w+)$'
while [[ $q =~ $re1 ]]; do
q=${q##*${BASH_REMATCH[0]}}
[[ ${BASH_REMATCH[1]} =~ $re2 ]] && eval "$1+=([${BASH_REMATCH[1]}]=${BASH_REMATCH[2]})"
done
}
declare -A params
get_query_string params
for k in "${!params[@]}"
do
v="${params[$k]}"
echo "$k : $v"
done
Обратите внимание, что параметры оказываются в массиве в обратном порядке (это ассоциативно, так что это не должно иметь значения).