在 bash 中解码 URL
Decode URL in bash
我正在尝试解码纯 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
将所有 +
替换为 space。
有更好的方法吗?还是我只需要查找每个可能的编码特殊字符并替换它?
您可以使用此函数进行URL解码:
decodeURL() { printf "%b\n" "$(sed 's/+/ /g; s/%\([0-9a-f][0-9a-f]\)/\x/g;')"; }
然后测试为:
decodeURL <<< 'hello+%26+world'
hello & world
解释:
printf %b
- 扩展相应参数中的反斜杠转义序列
s/+/ /g
- 将每个 +
替换为 space
s/%\([0-9a-f][0-9a-f]\)/\x/g
- 用文字 \x
和相同的十六进制字符替换每个 %
后跟 2 个十六进制字符,以便 printf
可以打印等效的 ASCII 字符
我正在尝试解码纯 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
将所有 +
替换为 space。
有更好的方法吗?还是我只需要查找每个可能的编码特殊字符并替换它?
您可以使用此函数进行URL解码:
decodeURL() { printf "%b\n" "$(sed 's/+/ /g; s/%\([0-9a-f][0-9a-f]\)/\x/g;')"; }
然后测试为:
decodeURL <<< 'hello+%26+world'
hello & world
解释:
printf %b
- 扩展相应参数中的反斜杠转义序列s/+/ /g
- 将每个+
替换为 spaces/%\([0-9a-f][0-9a-f]\)/\x/g
- 用文字\x
和相同的十六进制字符替换每个%
后跟 2 个十六进制字符,以便printf
可以打印等效的 ASCII 字符