Bash - 如何获取字符串长度排除转义字符

时间:2015-05-25 17:32:38

标签: bash shell escaping

我在〜/ .bashrc中编写了一个函数,根据当前的终端宽度绘制一条水平线。

p_blod=$(tput bold) #use p_orig to reset it
p_red=$(tput setaf 1) #print red
p_blue=$(tput setaf 21) #print blue
p_yellow=$(tput setaf 11) #print yellow
p_orig=$(tput sgr0) #print back original color

vzone() { 
        : "${3?"Usage : vzone '='(separator) y/b(color) b(bold)/nb(not blod) [separator_length_if_need_exclude_escape]"}" #\space or \( 

        local vzone_sep="$1"

        if [[ -z $4 ]]; then
                local t_cols=${#vzone_sep}  #only if the string didn't included escape characters
        else
                local t_cols="$4"
        fi

        if [[ "$3" == "b" ]]; then
                printf "%s" "${p_blod}"
        fi

        if [[ "$2" == "y" ]]; then
                printf "%s" "${p_yellow}"
        else
                printf "%s" "${p_blue}"
        fi

        eval printf %.0s"$vzone_sep" $(seq 1 "$((COLUMNS/t_cols))"); echo

        printf "%s" "${p_orig}"
}

然后调用者画出一行:

vzone '\(◔‿◔\)\ ♥' y b 7

截图: enter image description here

正如你所看到的,如果我没有手动计算放7,该行会因为 $ {#vzone_sep} 而错误,会给我包含转义字符斜杠的总字符串/

让我展示一个狭隘的例子:

[xiaobai@xiaobai tmp]$ vzone_sep="\(◔‿◔\)\ ♥"
[xiaobai@xiaobai tmp]$ printf ${#vzone_sep}
10[xiaobai@xiaobai tmp]$

我想要的是7,而不是包含转义字符的10。因此,在调用我的函数之前,调用者不必手动计算长度减去转义字符。

任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:2)

vzone_sep="\(◔‿◔\)\ ♥"
cleaned="${vzone_sep//\\/}"  # remove all \
printf "%d" "${#cleaned}"

输出:

7