在shell中使用 curl 实现 urlencode/url编码

在shell中使用 curl 实现 urlencode/url编码

编写shell脚本过程中,经常需要在脚本中请求某个url,并传递参数。

但是传递的参数包含空格或者冒号、逗号之类的特殊字符,是需要转码的。如果使用python等,可以方便的使用 urlencode

例如空格在url中,需要转码成:%20 。中文字符也需要进行编码

如果不进行编码的话,遇到空格,或者特殊字符,网络请求将不能正确的被执行

如何非常方便的,并且没副作用的将url进行编码?

目前有许多方式。例如可以维护一个 tab 表,将需要转码的字符进行映射。又或者使用正则匹配进行转码。但这些或多或少都不够友好

维护表,需要在脚本中编写大量无用代码。正则匹配无法覆盖所有范围。

使用 curl 对 url 进行编码

实际上 curl 可以用来进行url编码(这种方式不仅通用,而且比较简单):

脚本首先使用 which 检测 curl 是否已经安装,如果未安装将会编码失败并直接返回传入的参数

function urlencode() {
  which "curl" >/dev/null 2>&1; if [ ! $? -eq 0 ]; then echo -E "$1";return; fi
  encode_str=$(echo -E "$1" |sed "s/%/%%/g")
  printf -- "$encode_str" | curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" |cut -c 3-
}

将上方的方法直接复制到shell脚本中,然后使用如下方式调用即可:

这只是 urlencode 方法的一个使用示例

send_text=$(urlencode "$text")

这样传入的 $text 会被编码,然后就可以拼接到请求链接中了。不会有任何问题,请求链接的时候使用 $send_text

然后使用 curl 在访问链接的时候,拼接参数即可:

# 拼接到请求的路径中
curl http://example.com/$send_text

# 拼接到请求的参数中
curl http://example.com?param=$send_text

这样就不会遇到特殊字符导致请求失败,或参数传递失败的问题了

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2021/07/17/shell-curl-urlencode

Buy me a cup of coffee ☕.