我在bash shell中工作,我试图通过一个html页面,通过一个URL来循环处理传递给我的cgi脚本的每一个参数,我不确定在"$@"中使用for i是否能满足我的需要。我不确定在"$@"中使用for i是否符合我的要求。我需要循环浏览URL传递的每一个参数。
for site in "$@"
do
p=`links -dump $site`
done
下面是一个URL的例子。
cgi/word?http://en.wikipedia.org/wiki/Wienermobile+http://en.wikipedia.org/wiki/Apple
其中两个URL是我的参数。
我对深度cgi的使用和在网页和脚本之间的使用很陌生,所以如果这是一个简单的修复方法,请原谅我。
你给出的例子实际上不是一个有效的URL,因为它没有被正确地转义(例如,参见维基百科上的 "百分比编码")
cgi/word?http://en.wikipedia.org/wiki/Wienermobile+http://en.wikipedia.org/wiki/Apple
不如说是
cgi/word?http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWienermobile%20http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FApple
HTTP不是一个琐碎的协议,你可能最好使用一个框架,而不是在shell中编写(这增加了安全风险,因为shell会带来所有的陷阱
但是为了好玩,这里有一个在shell中解码查询字符串的CGI脚本示例。
#!/bin/sh
percentdecode() {
/usr/bin/printf "$(/usr/bin/printf %s "$1" | sed -e 's/%/\\x/g; s/+/ /g')"
}
qsdecode() (
IFS=\&
for kv in $QUERY_STRING ; do
IFS==
set -- $kv
if [ $# -ne 2 ]; then
echo "Not a valid key-value pair: $kv"
continue
fi
k=$(percentdecode "$1")
v=$(percentdecode="$2")
echo "Key: $k"
echo "Value: $v"
done
}
cat <<'EOF'
Status: 200 OK
Content-Type: text/plain; charset=UTF-8
EOF
qsdecode
它解析了传统的查询字符串格式,将一个键值存储传输为?a=b&c=d&e=f
. 建议你最好也按照这个格式格式。如果你一定要坚持这样的格式 ?value1+value2+value3
那么这就很简单的解析了。
decode_plusdelimited() (
unset IFS
# percentdecode maps '+' and '%20' to ' '
for value in $(percentdecode "$QUERY_STRING"); do
echo "Got value: $value"
done
)
(注意,你没有给出精确的加减法格式,所以这只是一个近似值)