编写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
这样就不会遇到特殊字符导致请求失败,或参数传递失败的问题了