# 百分号编码字符串
urlencode() {
# 用法: urlencode "string"
local LC_ALL=C
for (( i = 0; i < ${#1}; i++ )); do
: "${1:i:1}"
case "$_" in
[a-zA-Z0-9.~_-])
printf '%s' "$_"
;;
*)
printf '%%%02X' "'$_"
;;
esac
done
printf '\n'
}
语法说明:
local LC_ALL=C
- 去除所有本地化的设置,设置语言环境为POSIX【C】,让命令能正确执行;
- 使用local,就相当于在函数开始的时候定义变量,在函数返回之前做unset,只不过local用起来更简单明了。
${#1} "${1:i:1}"
-
${#1}
返回第一个参数的长度,即有多少个字符; -
"${1:i:1}"
每次提取一个字符
%%%02x
- %%%02x 可以分开为两部分"%%"和"%02X";
- 两个%%是输出一个'%',这里第一个%是转义符;
- %02x中的%x是把数字输出为16进制的格式,%02x是保证输出至少占两个字符的位置,如果不够两位的话前面补0
bash中的case语句
case ${VAR} in
pattern1)
commands1
;;
pattern2)
commands2
;;
esac
pattern表示通配符表达式,注意,与正则表达式有区别 比如:通配符如果加上双引号后就不是按通配符处理,而是按文本处理。