gpt4 book ai didi

bash - 传递变量时正确使用 curl --data-urlencode

转载 作者:行者123 更新时间:2023-11-29 08:53:03 24 4
gpt4 key购买 nike

我正在尝试优化我的代码,但借用了一段特定的代码。我想删除 sed,这样我就不会在主循环中使用任何外部进程。

function sendMsg () {
value=$(echo $1 | sed 's/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\&/%26/g;s/'\''/%28/g;s/(/%28/g;s/)/%29/g;s/:/%3A/g;s/\//%2F/g');
str="http://www.xxxx.com/api.ashx?v=1&k=$Key&a=send&w=$value";
curl -s $str;
}

为了清楚起见,我已经对其进行了编辑。 $value 只是在函数末尾通过 curl 命令转换为合适的 url 输出。

虽然这工作得很好,但我最感兴趣的是尽可能快地处理它,而不要 fork 到外部进程。

感谢到目前为止的评论!

目前我的位置是这样的:

function sendMsg () {
str="http://www.xxxx.com/api.ashx?v=1&k=$Key&a=send&w=";
curl -s $str --data-urlencode "$1";
}

我至少在正确的轨道上吗?

最佳答案

首先,回答你的问题:如果你做的是单一的替换或过滤,使用模式匹配会更快:

$ foo=${bar/old/new}               # Faster
$ foo=$(sed 's/old/new/' <<<$bar # Slower

第一个不需要生成子 shell 并运行 sed , 然后将其代回 $foo .然而,如果你这样做了将近十几次,我相信使用 sed可能会更快:

value=$(sed -e 's/ /%20/g' \
-e 's/!/%21/g' \
-e 's/"/%22/g' \
-e 's/#/%23/g' \
-e 's/\&/%26/g' \
-e 's/'\''/%28/g' \
-e 's/(/%28/g' \
-e 's/)/%29/g' \
-e 's/:/%3A/g' \
-e 's/\//%2F/g'<<<$1);

请注意,此语法更易于阅读,因为每个替换命令都在其自己的行中。另请注意 <<<消除了回显和管道的需要。

这只会调用一次 sed而模式匹配必须进行多次。

但是,您应该使用 --data--data-uuencode而不是自己构建查询字符串:

$ curl -s http://www.xxxx.com/api.ashx \
--data v=1 \
--data k=$Key \
--data a=send \
--data-urlencode w="$value";

--data--urlencode将对 $value 的值进行编码为你,所以你不必这样做。不幸的是,这个参数并不存在于 curl 的所有版本中。 .它是在 2008 年 1 月的版本 7.18.0 中添加的。运行 curl --version查看您的版本:

$ curl --version     # Life is good
curl 7.30.0 (x86_64-apple-darwin13.0) libcurl/7.30.0 SecureTransport zlib/1.2.5

$ curl --version # David Sad
curl 7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5

附录

In attempting this I'm getting an 'unsupported API versionERROR', even though my curl --version reports 7.29.0

我无法测试你有什么,但我决定尝试我们的 Jenkins 服务器,看看我是否可以设置构建描述。我确保描述中有空格,所以它需要 --data-urlencoding .此命令有效:

$ curl --user dweintraub:swordfish \
--data Submit=Submit \
--data-urlencode description="This is my test descripition" \
http://jenkins.corpwad.com/jenkins/job/Admin-5.1.1/138/submitDescription

这就像我做的一样:

$ curl -user "dweintraub:swordfish http://jenkins.corpwad.com/jenkins/job/Admin-5.1.1/138/submitDescription?Submit=Submit&desciption=This%20is%20my%20test%20descripition"

请注意 --data为您添加问号。

(不,swordfish 不是我的密码)。

它不像您的命令那么复杂,但它可能有助于指出您遇到问题的地方。你有用户名和密码吗?如果是这样,您需要 --user参数。

关于bash - 传递变量时正确使用 curl --data-urlencode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25270560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com