bash - 解析http查询字符串

时间:2017-11-04 10:41:16

标签: bash http parsing

我必须解析bash中的查询字符串;我在网上找到了很多解决方案,但是当星号是"值"时,我遇到了一个大问题。 o" key"。

1 - 有效的示例

$ PARAMS="key1=val1&key2=val2&key3=val3&key4=val4"
$ ARRAY=(${PARAMS//[=&]/ })
$ echo ${ARRAY[@]}
key1 val1 key2 val2 key3 val3 key4 val4
$

2 - 不起作用的示例(key4等于*

$ PARAMS="key1=val1&key2=val2&key3=val3&key4=*"
$ ARRAY=(${PARAMS//[=&]/ })
$ echo ${ARRAY[@]}
key1 val1 key2 val2 key3 val3 key4 file.txt file2.txt file3.txt ...
$

问题是星号*)代表工作目录中的所有文件。

是解决这个问题的方法吗? 谢谢

2 个答案:

答案 0 :(得分:1)

问题是,*在没有引用的情况下由shell扩展, 当您分配到ARRAYecho时,

要使shell不展开通配符,可以使用set -f。 如果是echo,您只需双引号:

$ PARAMS="key1=val1&key2=val2&key3=val3&key4=*"
$ set -f  # disable wildcard expansion
$ ARRAY=(${PARAMS//[=&]/ })
$ set +f  # restore wildcard expansion
$ echo "${ARRAY[@]}"
key1 val1 key2 val2 key3 val3 key4 *
$ echo "${#ARRAY[@]}"
8

答案 1 :(得分:0)

感谢@janos方法,我找到了解决方案:

$ PARAMS="key1=val1&key2=val2&key3=val3&key4=*"
$ set -f
$ ARRAY=(${PARAMS//[=&]/ })
$ set +f
$ echo "${ARRAY[1]}"
val1
$ echo "${ARRAY[7]}"
*
$