我有这个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¶m2=value2¶m3=value3
目前arr正则表达式拆分基于=
,所以它只能处理一个参数。我不知道如何改变这个正则表达式,所以我得到arr[1] = value1
; arr[2] = value2
等。
理想情况下,我需要它是一个关联数组,如:arr['param1'] = value1
但我不确定这是否可以在Bash中使用。
其他语言(PHP,Perl,Python)中的解决方案是可接受的,只要脚本的行为保持不变(即它需要获取查询字符串并从stdout输出标题+输出,并且能够杀死客户端断开连接时产生的进程。
欢迎任何有关如何消毒此输入的建议。
答案 0 :(得分:0)
您只需更改一行:
arr=(${QUERY_STRING//=/ })
使用:
arr=(${QUERY_STRING//[=&]/ })
然后你可以在奇数索引中得到你的值。
$ QUERY_STRING='param1=value1¶m2=value2¶m3=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//?(&)+([^&=])=/ }