我正在尝试用纯bash解码GET参数。
即:hello+%26+world
应该成为hello & world
到目前为止,我已经设法得到了这个:
#!/usr/bin/sh
echo "Content-type: text/plain"
echo ""
CMD=`echo "$QUERY_STRING" | grep -oE "(^|[?&])cmd=[^&]+" | sed "s/%20/ /g" | cut -f 2 -d "="`
CMD="${CMD//+/ }"
echo $CMD
用空格替换所有+
。
有更好的方法吗?或者我只需要查找每个可能的编码特殊字符并替换它?
答案 0 :(得分:7)
您可以使用此功能进行URL解码:
decodeURL() { printf "%b\n" "$(sed 's/+/ /g; s/%\([0-9a-f][0-9a-f]\)/\\x\1/g;')"; }
然后将其测试为:
decodeURL <<< 'hello+%26+world'
hello & world
<强>解释强>
printf %b
- 在相应的参数s/+/ /g
- 将每个+
替换为空格s/%\([0-9a-f][0-9a-f]\)/\\x\1/g
- 将每个%
后跟2个十六进制字符替换为文字\x
和相同的十六进制字符,以便printf
可以为其打印等效的ASCII字符