如何在Bash中拆分URL参数

时间:2014-12-27 21:38:03

标签: regex bash

我有这个Bash脚本:

#!/bin/bash

rawurldecode() {

  # This is perhaps a risky gambit, but since all escape characters must be
  # encoded, we can replace %NN with \xNN and pass the lot to printf -b, which
  # will decode hex for us

  printf -v REPLY '%b' "${1//%/\\x}" # You can either set a return variable (FASTER)

  echo "${REPLY}"  #+or echo the result (EASIER)... or both... :p
}

echo -e "Content-type: video/x-matroska\n"

arr=(${QUERY_STRING//=/ })
ffmpeg -i "$(rawurldecode ${arr[1]})" -acodec copy -vcodec copy -map 0:0 -map 0:2 -f matroska - 2>/dev/null &
pid=$!
trap "kill $pid" SIGTERM SIGPIPE
wait

我想更改它,以便它可以处理查询字符串中的多个参数,如下所示:

param1=value1&param2=value2&param3=value3

目前arr正则表达式拆分基于=,所以它只能处理一个参数。我不知道如何改变这个正则表达式,所以我得到arr[1] = value1; arr[2] = value2等。
理想情况下,我需要它是一个关联数组,如:arr['param1'] = value1但我不确定这是否可以在Bash中使用。

其他语言(PHP,Perl,Python)中的解决方案是可接受的,只要脚本的行为保持不变(即它需要获取查询字符串并从stdout输出标题+输出,并且能够杀死客户端断开连接时产生的进程。

欢迎任何有关如何消毒此输入的建议。

1 个答案:

答案 0 :(得分:0)

您只需更改一行:

arr=(${QUERY_STRING//=/ })

使用:

arr=(${QUERY_STRING//[=&]/ })

然后你可以在奇数索引中得到你的值。

实施例

$ QUERY_STRING='param1=value1&param2=value2&param3=value3'
$ arr=(${QUERY_STRING//[=&]/ })
$ echo ${arr[1]}
value1
$ echo ${arr[3]}
value2
$ echo ${arr[5]}
value3

再次阅读你的问题,我看到你想要后续索引中的值。您可以使用extglob shell选项执行此操作,如下所示:

shopt -s extglob # with this you enable 'extglob'
arr=${QUERY_STRING//?(&)+([^&=])=/ }