我必须解析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 ...
$
问题是星号(*
)代表工作目录中的所有文件。
是解决这个问题的方法吗? 谢谢
答案 0 :(得分:1)
问题是,*
在没有引用的情况下由shell扩展,
当您分配到ARRAY
和echo
时,
要使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]}"
*
$