一、字符串切片:

${#var}:返回字符串变量var的长度
${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset:number}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var: -length}:取字符串的最右侧几个字符,注意:冒号后必须有一空白字符
${var:offset:-length}:从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容
${var: -length:-offset}:先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length前空格,同样的表达形式,offset的表现行为和数组的是反着的。

字符串切片实例:

  1. a='abcdefghijklmn'
  2. echo ${#a} #输出字符串a的总长度
  3. 14
  4. echo ${a:4} #输出字符串a从0开始数,包含第4个元素之后的所有元素
  5. efghijklmn
  6. echo ${a:4:3} #输出字符串a从0开始数,包含第4个元素之后的3个元素
  7. efg
  8. echo ${a: -4} #从字符串a的右侧向左取4个元素,冒号后必须有一个空字符
  9. klmn
  10. echo ${a:5:-2} #输出字符串a从0开始数,包含第5个元素的向右数的i倒数3个元素,注意这种用法依赖bash版本,尽量别用。
  11. fghijkl
  12. echo ${a: -5:-2} #从字符串a的右侧向左数5个,再向右取到倒数3个字符,注意这种用法依赖bash版本,尽量别用。
  13. jkl
  14. echo ${a: -5:2} #从字符串a的右侧向左数5个,再向右取2个字符
  15. jk

二、基于模式取子串

${var#*word}:其中word可以是指定的任意字符功能:自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符之间的所有字符
${var##*word}:同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容
${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;
${var%%word*}:同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符;

字符处理实例:

  1. a='abcdefg_a_fghijklmn'
  2. echo ${a#*fg} #从左边开始删,删除起始位置到第一个fg为止,包括fg
  3. _a_fghijklmn
  4. echo ${a##*fg} #贪婪模式,左边开始删,删除起始位置到最后一个fg为止,包括fg
  5. hijklmn
  6. echo ${a%fg*} #从右边开始删,删除终点位置到第一个fg为止,包括fg
  7. abcdefg_a_
  8. echo ${a%%fg*} #贪婪模式,从右边开始删,删除重点位置到最后一个fg为止,包括fg
  9. abcde

三、字符串的查找替换

${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之
${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之
${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之

查找替换实例:

  1. a='abcdefg_a_fghijklmn'
  2. echo ${a/fg/dd} #替换从左边数第一个fg为dd
  3. abcdedd_a_fghijklmn
  4. echo ${a//fg/dd} #替换字符串中所有的fg为dd
  5. abcdedd_a_ddhijklmn
  6. echo ${a/#ab/dd} #如果开头是ab则替换成dd
  7. ddcdefg_a_fghijklmn
  8. echo ${a/#fd/dd} #如果开头是fd则替换成dd
  9. abcdefg_a_fghijklmn #开头不是fd不做替换
  10. echo ${a/%mn/dd} #结尾是mn则替换成dd
  11. abcdefg_a_fghijkldd
  12. echo ${a/%fd/dd} #如果结尾是fd则替换成dd
  13. abcdefg_a_fghijklmn #结尾并不是fd不做替换

四、查找并删除字符串

和查找替换类似,只不过没有替换值

${var/pattern}:删除var所表示的字符串中第一次被pattern所匹配到的字符串
${var//pattern}:删除var所表示的字符串中所有被pattern所匹配到的字符串
${var/#pattern}:删除var所表示的字符串中所有以pattern为行首所匹配到的字符串
${var/%pattern}:删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串

和查找替换语法一样,只不过没有替换值和斜线,这里就不做演示了。

五、符大小写转换

${var^^}:把var中的所有小写字母转换为大写
${var,,}:把var中的所有大写字母转换为小写

总结:使用shell内部的字符串处理功能能提高很多的工作效率,以及节省部分机器性能,但是需要注意的一点,字符串处理变量的值并不会改变变量的数据,只是输出的时候进行了变更。

六、字符串变量赋值

使用字符串的变量赋值,可以代替部分的if else让语法更简洁。

 

shell字符串处理的更多相关文章

  1. linux shell 字符串操作(长度,查找,替换)详解

    linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...

  2. Shell 字符串比较

    转自网络 Shell字符串比较 收藏 Shell 中整数比较方法及字符串的比较方法,如等于,不等于,大于,大于等于,小于,等等. 二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别. --- ...

  3. shell字符串操作详解

    shell字符串操作详解的相关资料. 1.shell变量声明的判断  表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...

  4. 【转】shell字符串截取

    shell字符串的截取的问题: 一.Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr “$a” 1 8 2.echo $a|awk ‘{print substr( ...

  5. shell字符串的用法

    shell字符串的用法 注意:shell4.2和shell4.1会有差别,较低版本的shell可能不支持某些功能 获取字符串长度:${#string} 获取子串: 注:(左边的第一个字符是用 0 表示 ...

  6. Linux脚本shell字符串处理

    Linux脚本shell字符串处理,基本都有了,看着搜吧 TLDP教堂 shell中if条件字符串.数字比对,[[ ]]和[ ]区别 Linux 之 shell 比较运算符 Linux Shell编程 ...

  7. 【Linux】shell字符串分割、数组访问、条件判断

    参考资料: shell字符串分割再循环:http://www.shangxueba.com/jingyan/1633455.html linux shell中 if else以及大于.小于.等于逻辑表 ...

  8. shell 字符串中定位字符位置 获取字符位置

    linux shell 字符串操作(长度,查找,替换)详解 该博文中描述的如下两个字符串操作, ${string:position} #在$string中, 从位置$position开始提取子串 ${ ...

  9. Shell字符串操作

    @1:子串削除 ${string#substring} 从$string 的开头位置截掉最短匹配的$substring. ${string##substring} 从$string 的开头位置截掉最长 ...

  10. Linux Shell系列教程之(五)Shell字符串

    本文是Linux Shell系列教程的第(五)篇,更多shell教程请看:Linux Shell系列教程 字符串是Shell编程中最常用最有用的数据类型,今天,Linux大学网就为大家介绍一下在She ...

随机推荐

  1. Java学习笔记-抽象类与接口

    抽象类用于在类中不用具体实现,而在子类中去实现的类 抽象类 抽象类概述 抽象定义:抽象就是从多个事物中将共性的,本质的内容抽取出来 抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完 ...

  2. @ControllerAdvice和@ExceptionHandler

    1. 使用 @ControllerAdvice和@ExceptionHandler处理全局异常 1. 新建异常信息实体类 非必要的类,主要用于包装异常信息. package com.test.exce ...

  3. 修改Ubuntu屏幕的分辨率

      最近重新装了一下环境,用vnc连接服务器,发现分辨率过低,于是查了一下如何修改分辨率,将其调高.   编辑/etc/default/grub 搜索"#GRUB_GFXMODE=640x4 ...

  4. docker入门1--简介、安装

      一. Docker是什么,能做什么,好处和坏处都在哪里? Docker是一个开源的应用容器引擎,用Go语言写成. Docker最主要的作用,就是将程序执行所需要的环境变量与开发的程序代码进行打包处 ...

  5. vimium快捷键修改

    vimium是一款很好用的浏览器插件,可以用键盘来进行一些操作. 需要在浏览器的扩展程序商店里下载相应的插件,然后可以右键点击插件打开选项进行个性化的配置. map+字母+功能描述 功能描述从opti ...

  6. 【转帖】深挖NUMA

    深挖NUMA http://www.litrin.net/2017/10/31/深挖numa/ 首先列出本站之前相关的几篇帖子: Linux的NUMA机制 NUMA对性能的影响 cgroup的cpus ...

  7. mysql在字符编辑窗口下怎么退出编辑界面?(mysql下的ctrl+c与\c)

    [1]SQL编辑 我们在SQL编辑的时候打错了,想要退出编辑重新输入,或者是不想写了. 如下图 (1)如果我们直接按ctrl+c中断,那么直接退出整个linux了,如上图 (2)我们可以使用\c,直接 ...

  8. PID程序实现

    传统PID(位置式PID控制)调节: 这种算法的缺点是,由于全量输出,每次输出均与过去的状态有关,计算时要对 e(k) 进行累加,计算机运算工作量大.而且,因为计算机输出的 u(k) 对应的是执行机构 ...

  9. 【AC自动机】单词

    [题目链接] https://loj.ac/problem/10060 [题意] 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. ...

  10. Microsoft SQL Server 2008 R2 Express and Management Studio Express

    https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads Microsoft SQL Server 2008 R2 RTM - E ...