Skip to content

Shell-4-字符串处理

${}

获取字符串长度

${#字符串}

eg:

1
2
3
4
echo ${#"Boii"}     # 错误写法

word="Boii"
echo ${#word}       # 4

字符串切片

${string:start:length}  # 对 string 从 start 开始截取 length 个字符
${string:start}          # 对 string 从 start 开始截取到 字符串末尾

下标从 0 开始,负数表示倒数第 n 个。

eg:

string:| H | e | l | l | o |   | B | o | i | i |
正标:  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
负标:  |-10| -9| -8| -7| -6| -5| -4| -3| -2| -1| 

word="Hello Boii"

# 从左往右数,向右截取
echo ${word:0:5}    # Hello
echo ${word:6:2}    # Bo    从第7个开始,截取2个
echo ${word:6:-1}   # Boi  从第7个开始,截取至倒数第1个
echo ${word:6}      # Boii 从第7个开始,截取至末尾
echo ${word:(-1)}   # i    截取最后一个字符
echo ${word:(-2)}   # ii   截取最后两个字符
echo ${word:(-3):2} # oi   从倒数第3个开始,截取2个

# 从右往左数,向右截取
echo ${word:0-8:5}      # llo B
echo ${word:0-8}        # llo Boii

替换字符串

${string/OLD/NEW}   # 用 NEW 替换字符串中 第一个 OLD
${string//OLD/NEW}  # 用 NEW 替换字符串中 所有 OLD

eg:

1
2
3
str="abc,def,ghi,abcxyz"
echo ${str/abc/BOII}    # BOII,def,ghi,abcxyz
echo ${str//abc/BOII}   # BOII,def,ghi,BOIIxyz

字符串截取

  • #:取右、删头
    • #:最短匹配,匹配第一个
    • ##:最长匹配,匹配最后一个
  • %:取左、删尾
    • %:最短匹配,匹配第一个
    • %%:最长匹配,匹配最后一个
1
2
3
4
str="opcabxyzc,def,ghi,abcxyz"

echo ${str#*ab}     # xyzc,,def,ghi,abcxyz
echo ${str##*ab}    # cxyz
1
2
3
4
str="opcabxyzc,def,ghi,abcxyz"

echo ${str%xyz*}    # abxyzc,def,ghi,abc
echo ${str%%xyz*}   # ab

变量状态赋值

  • ${VAR:-str} 如果 VAR 变量为空则返回 str

    1
    2
    3
    4
    5
    if VAR == nil {
        return str
    }else{
        return VAR
    }
    

    eg:

    1
    2
    3
    4
    5
    word=
    echo ${word:-abc}   # abc
    
    word=123
    echo ${word:-abc}   # 123
    
  • ${VAR:+str} 如果 VAR 变量不为空则返回 str

    1
    2
    3
    4
    5
    if VAR != nil {
        return str
    }else{
        return nil
    }
    

    eg:

    1
    2
    3
    4
    5
    word=
    echo ${word:+abc}   #
    
    word=123
    echo ${word:+abc}   # abc
    
  • ${VAR:=str} 如果 VAR 变量为空则重新赋值 VAR 变量值为 str

    1
    2
    3
    if VAR == nil {
        VAR = str
    }
    

    eg:

    1
    2
    3
    4
    5
    word=
    echo ${word:=abc}   # abc
    
    word=123
    echo ${word:=abc}   # 123
    
  • ${VAR:?str} 如果 VAR 变量为空则将 str 输出到 stderr

    1
    2
    3
    if VAR == nil {
        panic(str)
    }
    

    eg:

    1
    2
    3
    4
    5
    word=
    echo ${word:?word is empty} # test.sh:行2: word: word is empty
    
    word2="aaa"
    echo ${word2:?word2 is empty} # aaa
    

字符串颜色

\033[0m 关闭属性; \033[XY 设置属性,X为具体参数,多个参数用分号;隔开。Y为模式

模式:

  • m: 文本颜色
  • A | B | C | D : 光标移动
  • H | s | u | ?25l | ?25h : 设置、保存、恢复、显示、隐藏光标位置
  • 2J | K: 清除

文本颜色

\033[字体属性;背景色;字体色m 文本内容 \033[0m

颜色 背景色代码 字体色代码 高亮色码
黑 Black 40 30 90
红 Red 41 31 91
绿 Green 42 32 92
黄 Yelllow 43 33 93
蓝 Blue 44 34 94
紫 Magenta 45 35 95
青 Cyan 46 36 96
白 White 47 37 97
字体属性 代码
0 常规
1 加粗
4 下划线
5 闪烁
7 反色
8 消隐

字体属性可以叠加,参数之间用分号隔开。

eg:粗体+下划线+白底红字 -> \033[1;4;47;31m 文本内容 \033[0m

光标

\033[nA: 光标上移 n 行 \033[nB: 光标下移 n 行 \033[nC: 光标左移 n 行 \033[nD: 光标右移 n 行

1
2
3
  A
C   D
  B

\033[y;xH 设置光标位置为第 y 行 第 x 个字符。

\033[s: 保存光标位置

\033[u: 恢复光标位置

\033[?25l: 隐藏光标

\033[?25h: 显示光标

\033[K: 清除从光标到行尾的内容

\033[2J: 清屏