• shell编程基础(第10篇:字符串)


    前言

        字符串,所有编程语言都有的概念,本质为一组字符组成的序列,在shell编程中更特别,因为字符串是shell中唯一的数据类型,哪怕你看到的是一个数字,它也是字符串,比如100

    first=100

        100虽然是个数字,但它再shell中也是字符串,因为字符串是shell中唯一的数据类型(备注:理解为shell没有数据类型,只有字符串)

    创建字符串的3种方式

    1、无引号

    first=hello

    2、单引号

    first='hello'

    3、双引号

    first="hello"

    无引号:所有特殊字符保留作用

    单引号:所有字符原样输出,所有特殊字符全部失去作用,且单词分隔功能失效,比如$、比如$()

    双引号:支持变量替换、命令替换,其它所有字符会原样输出,且单词分隔功能失效

    (备注:shell以IFS环境变量修饰的字符作为单词的分隔符,IFS的默认值是:空格字符、换行字符、制表符)

    单词分隔

    first=hello

     shell编程中,以IFS的默认值称为空白字符(换行、空格、制表,一共3个空白字符),空白字符作为单词分隔的字符,而单引号与双引号,均可让单词分割功能失效,当我们需要包括空格字符的时候,则必须使用单引号或者双引号将字符串括起来。

    second="hello world"

    此时由于双引号的存在,单词分隔功能失效,所以"hello world"成为一个整体,而不再是单独的2个单词

    字符串长度的获取

    1. str="wang"
    2. echo ${#str}

    请严格遵守标准的语法:${#变量名},因为#在shell编程中是个特殊变量名,表示命令行参数的个数

    字符串拼接

    其它语言使用+号拼接字符串,shell编程中,只要字符串挨着即为拼接,无需+号

    1. a=wang
    2. b=yuan
    3. c=$a$b

    解读代码:c=$a$b

    1、先做变量值替换,所以$a会替换为wang、$b会被替换yuan

    2、接着开始拼接为一个字符串wangyuan

    3、结果再次赋值给变量c

    紧紧的挨着字符串,即可完成字符串拼接,省去了其它语言常用的+号

    理解字符串拼接

    1. Java
    2. String first = "hi";
    3. String second = "man"
    4. String result = first + second;

    Java或者其他语言,总使用+号作为字符串拼接的连接符,而shell编程不需要任何字符作为连接符,字符串之间紧紧需要挨着即为拼接

    1. Shell
    2. first=hi
    3. second=man
    4. result=$first$second

    一般情况下单词中间要有个空白字符,所以此时必须使用单引号或者双引号,使单词分隔功能失效,这样才能拼接为一个字符串,且包括空白字符,否则单词分隔功能一旦开始工作,会让bash认为第一个单词为命令,后面的单词为传递给命令的参数,从而引起错误(这个shell编程的标准,规定第一个单词是命令)

    1. Shell
    2. first=hi
    3. second=man
    4. result="$first $second"

    大小写

    1. # 转为大写
    2. ${varname^^}
    3. # 转为小写
    4. ${varname,,}

    英文字符,经常有转换大小写的概念,参照语法实现即可,注意:原始的变量值并不会改变,除非你再次赋值

    子串操作

    从一个字符串中,提取一部分字符串,称为子串操作

    1、从头部开始截取子串

    1. 注意:
    2. 1、原始变量值不变
    3. 2、不是正则
    4. 3、匹配不成功,返回原始字符串
    5. 4、匹配成功,匹配部分被删除,返回剩下的字符串
    6. ${variable#pattern}
    1. temp=helloworld
    2. echo ${temp#hello}

    输出:

    world

    2、从尾部截取子串

    1. 注意:
    2. 1、原始字符串值不变
    3. 2、不是正则
    4. 3、匹配不成功,返回原始字符串
    5. 4、匹配成功,匹配的部分会被删除,返回剩下的子串
    6. 结尾
    7. 1、如果 pattern 匹配变量的结尾,删除最短匹配的部分,返回剩余部分
    8. ${variable%pattern} (非贪婪匹配,使用一个%)
    9. $ echo ${my_hello%ld}
    10. hellowor
    11. $ echo ${my_hello%w*}
    12. hello

    指定下标截取子串

    序列的下标的从0开始,字符串作为序列,同时以0开始

    1、基本语法

    ${varname:offset:length}

    2、来个例子

    1. #!/bin/bash
    2. demo=helloworld
    3. echo ${demo:1:4}

    ${demo:1:4}的解释

    变量名为demo

    起始下标为1

    截取的字符串长度4

    所以最后的输出:

    ello

    3、不会改变原始字符串,只是提取出来一段子串

    ${demo:1:4}

    demo指向的字符串并没有任何改变

    4、可以省略字符串长度,表示到字符串末尾

    ${demo:1}

    输出:

    elloworld

    字符串替换

    1、从字符串的头部开始替换(只替换匹配的第一个)

    1. demo="helloworldworld"
    2. echo ${demo/#world/love}

    输出:

    helloloveworld

    2、从字符串的尾部开始替换(只替换匹配的第一个)

    1. demo="helloworldworld"
    2. echo ${demo/%world/love}

    输出: 

    helloworldlove

    3、从字符串的中间开始替换(只替换一个)

    1. demo="helloworldworld"
    2. echo ${demo/world/love}

    输出:

    helloloveworld

    4、从字符串的中间替换(替换所有)

    1. demo="helloworldworld"
    2. echo ${demo//world/love}

    输出:

    hellolovelove

    总结

    1、字符串拼接,不需要额外的+号,仅需挨着放在一起即为拼接,现在想想其他语言使用+号拼接是不是多此一举?

    2、常常使用双引号修饰字符串,因为双引号中可以使用变量替换、命令替换、且又能完成带有空白空白字符的字符串拼接

    3、shell编程中只有字符串一种数据类型,你看到每个都是字符串,包括看到的数字

  • 相关阅读:
    NX二次开发UF_CAM_set_auto_blank 函数介绍
    06 Job/CronJob: 为什么不直接用Pod来处理业务?
    MyBatisPlus
    mysql中update更新时加条件和不加条件速度对比
    c#WinFrom自定义图表仪表控件-频谱
    ANR问题--相机相关的debug
    高NA傅里叶显微镜单分子成像
    5.11-5.12Union-Find算法详解
    基于条形码的WMS仓储管理系统有什么优势
    GORM CRUD 5 分钟快速上手
  • 原文地址:https://blog.csdn.net/cadi2011/article/details/126024068