在 shell 中实现 urlencode 编码
在shell中实现 urlencode编码
在shell中进行urlencode编码有两种方式,一种是通过 curl
,另外一种是通过 xxd
来达成结果,经实测使用 curl
来进行urlencode的编码效率更高。以下是两种实现方式:
使用 curl
进行 urlencode编码
脚本首先使用 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
这样就不会遇到特殊字符导致请求失败,或参数传递失败的问题了。
Bash shell 的 urlencode() / urldecode()
function urlencode() {
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
esac
done
}
function urldecode() {
# urldecode <string>
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
Link: