shell 通用命令之字符串操作

368 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

为了更好完善解放双手系列.并在进行一键创建项目的过程中.对于特殊关键词,少不了对字符串的操作.下面我们一起来学习一下吧.

您能在这里看到啥

  1. 字符串
  2. 字符串操作

字符串

字符串可以使用单引号‘’,也可以使用双引号"",也可以不使用.如下所示

str=shell
str1="shell"
str2='shell'

下面记录三者的区别

  1. 单引号
    • 被单引号包围的字符都会原样输出,就算是变量也会变成了字符失去其作用.
    • 字符串不能出现在单引号中
  2. 双引号
    • 如果双引号中包含了变量,使用$去修饰变量.不然就只会输出变量字符串.
    • 字符串中可以出现双引号.需要转义.
  3. 纯字符串
    • 如果有变量,也会被解析.
    • 字符串不能出现空格,否则空格后边的字符串会被当作其他变量.

相对来说,代码更直观.如下所示

st=shell
s1=hello$st
s2="hello\"$st\""
s3='hello $st'
echo "$s1"
echo "$s2"
echo "$s3"

输入结果如下所示:

截屏2022-11-29 21.39.49.png

从结果中,我们得到一个结果,被单引号包裹的变量,真的就会变成了字符串

字符串操作

  1. 字符串拼接

    字符串拼接相对简单点.我这就简单举个例子.

    a="hello"
    b="shell"
    s1=$a$b
    s2="$a$b"
    s3="$a tb $b"
    s4=$a" tb "$b
    s5="${a}and${b}"
    echo "$s1"
    echo "$s2"
    echo "$s3"   
    echo "$s4"
    echo "$s5"
    

    输出结果如下所示:

    截屏2022-11-29 21.58.15.png

  2. 字符串截取

    截取算是使用比较频繁的操作.一般

    • 指定位置截取

      这种方式需要两个参数才可以完成.第一个:起始位置.第二个:截取长度.

      • 从字符串左边开始

        语法: ${a: start:length}

        含义:

        • a:被截取字符串
        • start: 起始位置,从左边开始
        • length:截取长度

        eg:

        a="shell"
        echo "${a: 2: 2}"
        输出el
        echo "${a: 2}" #不设置长度,默认截取到字符串末尾
        
      • 从字符串右边开始

        语法: ${a: 0-start:length}

        含义:

        • a:被截取字符串
        • 0-start: 起始位置,从右边开始
        • length:截取长度

        eg:

        a="shell"
        echo "${a: 0-2: 2}"
        输出el
        echo "${a: 0-2}" #不设置长度,默认截取到字符串末尾
        

      总结:

      不论从哪里开始.截取的顺序都是从左向右.

    • 指定字符串截取

      相对👆的方式,这个只能从指定字符串截取到字符串尾.

      • 截取右边字符串

        • 使用#号截取指定字符右边所有字符 语法: ${a#*chars} **含义:
          • a:被截取字符串
          • chars:指定字符

        eg:

        a="shellhello"
        echo "${a#*l}"
        输出`lhello`
        

        注意:以上写法只会匹配指定字符一个时,就停止.如果你想直到最后一个指定字符再结束.使用##,${a##*chars}

      • 截取左边字符串

        • 使用%可以截取指定字符左边所有字符. 语法: ${a%chars*} **含义:
          • a:被截取字符串
          • chars:指定字符

        eg:

        a="shellhello"
        echo "${a%h*}"
        输出`shell`
        

        注意:以上写法只会匹配指定字符一个时,就停止.如果你想直到最后一个指定字符再结束.使用%%, ${a%%chars*}

  3. 字符串分割

    字符串分割:将字符串以特定的条件,切割成一个数组.

    • 使用字符串分割

      语法: (${p//b/a})

      含义: 用a去替换p变量中所有b.

      eg:

      p="1,2,3,4,5,6"
      arr=("${p//,/ }")
      length=${#arr[@]}
      for ((i = 0; i < "$length"; i++)); do
             st=${arr[$i]}
             echo "$st"
      done
      

      执行结果如下所示:

      截屏2022-11-29 20.53.20.png

    • 配置分割符,使用IFS变量

      IFS: 内部域分割符.这个相对来说比较复杂,这里我们就详细讲解了.直接举例说一下,回头我也会好好的学习一下IFS,然后在好好的分享一下.

    eg:

    p="1,2,3,4,5,6"
    OLD_IFS="$IFS"
    IFS=","
    array=("$p")
    IFS="$OLD_IFS"
    for var in "${array[@]}"; do
        echo "$var"
    done
    
  4. 字符串替换

字符串替换:其实就是先查找到目标字符串,然后执行替换操作.

  • 替换第一个

    替换匹配到的第一个目标字符.

    语法: ${a/str1/str2}

    用法:

    a="hello shell"
    echo "${a/he/HE}"
    输出HEllo shell
    
  • 替换所有

    替换所有匹配到的目标字符.

    语法: ${a//str1/str2}

    用法:

    a="hello shell"
    echo "${a//he/HE}"
    输出HEllo sHEll
    
  • 替换开头一个

    替换开头目标字符.

    语法: ${a/#str1/str2}

    用法:

    a="hello shell"
    echo "${a/#he/HE}"
    输出HEllo shell
    
  • 替换结尾一个

    替换结尾目标字符.

    语法: ${a/%str1/str2}

    用法:

    a="hello shell"
    echo "${a/%ll/LL}"
    输出hello sheLL
    

系列文章

参考文章