将URL作为参数传递给CGI脚本。

问题描述 投票:2回答:1

我在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的使用和在网页和脚本之间的使用很陌生,所以如果这是一个简单的修复方法,请原谅我。

bash shell url cgi
1个回答
1
投票

你给出的例子实际上不是一个有效的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
)

(注意,你没有给出精确的加减法格式,所以这只是一个近似值)

© www.soinside.com 2019 - 2024. All rights reserved.