Skip to content

Latest commit

 

History

History
70 lines (51 loc) · 1.53 KB

百分号编码字符串.md

File metadata and controls

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