Skip to content

Latest commit

 

History

History
67 lines (47 loc) · 1.53 KB

百分号编码字符串.md

File metadata and controls

67 lines (47 loc) · 1.53 KB

百分号编码字符串

# 百分号编码字符串
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表示通配符表达式,注意,与正则表达式有区别 比如:通配符如果加上双引号后就不是按通配符处理,而是按文本处理。