在shell中,当我们已经获取到某个变量的变量值的时候,可能还需要对变量值进行一定的处理,才能到我们最终想要的结果,今天我们就来聊聊shell中常见的变量处理方法,我们通常会对变量进行如下处理。

一、获取变量的长度(字符串长度)。

二、对变量值进行截取(截取字符串)。

三、替换变量值中的某段字符。

四、删除变量值中的某段字符。

五、对变量值进行大小写转换。

六、当变量值为空时,对变量进行一些操作。

上述处理都是一些常见的操作,我们一个一个慢慢聊,这篇文章中,我们只对前两种操作进行总结,即怎样获取变量长度,以及怎样对变量值进行截取。

一、获取变量长度

通常,我们有可能需要获取变量值的长度,比如,变量中存放了一个字符串,我们需要获取字符串的长度,则可以使用如下方法。

如上图所示,website变量的值为”www.zsythink.net”,”www.zsythink.net”字符串一共由16个字符组成,当输出${#website}时,即可输出变量website的长度,很简单吧。

二、截取变量

有时候,我们只是需要变量值中的某一段,所以,我们需要截取这段内容为我们所用。而截取变量的方法又有不少,我们一一道来。

从指定位置开始截取字符串

通常,我们需要从指定的位置开始截取字符串,截取到字符串的末尾,示例如下。

上例中的”:4″表示从website变量值的第4个字符开始,截取到变量值的末尾。

细心如你一定发现了,上例中,所谓的从第4个字符开始截取,是”从左向右”数的第4个字符,换句话说,就是从正数第4个字符开始截取,截取到字符串的末尾,如果我们想要从倒数第4个字符开始截取,截取到字符串的末尾,我们该怎么办呢?示例如下

上例中的”:0-4″表示从website变量值的倒数第4个字符开始,截取到变量值的末尾。

从上例可以看出,”:0-4″中的”0″可以使用”空格”代替,效果是相同的,但是,从上例中可以看出,”冒号”与”负号”之间如果不存在任何字符,则无法起到截取字符的效果,所以,上图中第三种写法是错误的。

从指定位置开始截取字符串,并且指定截取字符的长度

除了能够指定截取操作的开始位置,我们还能够指定截取的长度,比如,从变量的第4个字符开始截取,截取8个字符的长度,示例如下。

没错,”:4:8″表示从正数第4个字符开始截取,向后截取8个字符的长度。

聪明如你一定想到了,我们能不能从倒数的位置开始,截取指定长度的字符呢?必须能的,示例如下。

如上图所示,”:0-12:9″表示从倒数第12个字符开始,向后截取9个字符,与之前的示例同理,”冒号”与”负号”之间如果不存在任何字符,则无法起到截取字符的效果,所以,上图中第三种写法是错误的。

在上述示例中,我们指定了截取字符的长度,比如上例中的”:0-12:9″,表示截取9个字符的长度,其实,在centos7中,我们可以将截取字符的长度指定为”负数”,但是注意,centos6中截取字符串的长度不能为”负数”,否则会报错,我们来看看在centos7中,将截取长度指定为”负数”后的效果。示例如下

如上图所示,在centos7中,”:0-12″表示从倒数第12个字符开始,向后截取所有字符,当同时指定截取长度为”:-4″时,表示从倒数第12个字符向后截取所有字符以后,删除截取以后的字符的最后4个字符,换句话说,也可以理解成截取最后12个字符的前8个字符。

但是,使用上述方法是需要注意一点,删除截取以后的字符数量不能大于现有字符的数量,示例如下。

如上图所示,我们一共就截取了12个字符,如果将截取长度指定为”-13″,则会报上述错误:-bash: XX : substring expression < 0

注意:在centos7中,使用这种写法的时候要计算好截取的范围,否则会报错

掐头去尾截取之掐头截取

所谓的”掐头去尾”,其实就是删除某个字符左侧的所有字符(掐头),或者删除某个字符右侧的所有字符(去尾),这样说可能不容易理解,我们来看一些小例子,就能明白了。

先从所谓的”掐头”聊起,示例如下。

如上例所示,我们使用”#*.”即可删除字符串中从左向右数第一个 “.” 以及其左侧的全部字符,这就是所谓”掐头去尾”中的掐头,准确的说,应该是掐去头部,截取尾部。

聪明如你一定已经会举一反三了,我们可以把上例中的 “.” 替换成其他字符,也是同样适用的,示例如下。

如上图所示,”#*A”表示删除字符串中从左向右第一个遇到的A,以及其左侧的字符。

换句话说,从左向右第一个遇到的A以及其左侧的字符都被当做”头部”掐去了。

其实,除了能够使用”#*字符”的语法进行”掐头”,其实还有另一种方法,也能实现”掐头”的操作,只不过它们略有些不同,示例如下。

如上例所示,”##*.”表示删除字符串中从左向右最后一个遇到的 “.” ,以及其左侧的字符。

换句话说,从左向右最后一个遇到的 “.” 以及其左侧的字符都被当做”头部”掐去了。

没错,通过上例即可对比出两种写法的不同。

“#*.”表示删除字符串中从左向右第一个遇到的 “.” ,以及其左侧的字符。

“##*.”表示删除字符串中从左向右最后一个遇到的 “.” ,以及其左侧的字符。

当然,上例中的”.”也是可以根据实际情况替换成其他字符的,示例如下。

经过上述示例,你应该已经明白了,赶紧动手试试吧。

掐头去尾截取之去尾截取

与之前描述的”掐头截取”相似,只要理解了之前的示例,再来理解”去尾截取”,简直不要太简单。

我们先来看一个小示例。

如上图所示,”%/*”表示删除字符串中从右向左第一个遇到的 “/” ,以及其右侧的字符。

换句话说,从右向左第一个遇到的 “/” 以及其右侧的字符都被当做”尾部”去掉了。

举一反三,我们可以根据实际情况,将上例中的”/”替换成别的字符,示例如下。

聪明如你,一定想到了,”去尾”截取法不止有上述一种方法,还有另一种”去尾”截取法,它们之间也略有不同,示例如下

上例中,”%%/*”表示删除字符串中从右向左最后一个遇到的 “/” ,以及其右侧的字符。

换句话说,从右向左最后一个遇到的 “/” 以及其右侧的字符都被当做”尾部”去掉了。

小结

我们对文章中的语法进行一次总结,方便以后回顾。

获取字符串长度

# testvar="12345"

# echo ${#testvar}

5

从指定位置截取字符串,截取到字符串的末尾

#下例表示从正数第4个字符以后开始截取,直到字符串的末尾。

# website="www.zsythink.net"

# echo ${website:4}

zsythink.net

#下例表示从倒数第4个字符开始截取,直到字符串的末尾

#注意:下例中的”负号”与”冒号”之间必须存在任意字符(通常使用0或空格占位),否则无法起到截取字符串的作用。

# website="www.zsythink.net"

# echo ${website:0-4}

.net

# echo ${website: -4}

.net

# echo ${website:a-4}

.net

从指定位置截取字符串,并且截取指定的长度

#下例表示从正数第4个字符以后开始截取,截取8个字符。

# website="www.zsythink.net"

# echo ${website:4:8}

zsythink

#下例表示从倒数第9个字符开始截取,截取5个字符。

# website="www.zsythink.net"

# echo ${website:0-9:5}

think

##centos7中,截取长度可以为负数,centos6中不行,centos7中的示例如下

#下例表示从正数第4个字符以后开始截取,截取到字符串的末尾,再将截取后的字符串的最后3个字符删除。

# website="www.zsythink.net"

# echo ${website:4:-3}

zsythink.

##centos7中,截取长度可以为负数,centos6中不行,centos7中的示例如下

#下例表示从倒数第4个字符开始截取,截取到字符串的末尾,再将截取后的字符串的最后1个字符删除。

# website="www.zsythink.net"

# echo ${website:0-4:-1}

.ne

掐头去尾截取之掐头截取

掐头截取:删除字符串中从左向右第一个遇到的char,以及其左侧的字符

##语法:${var#*char}

#下例表示删除字符串中从左向右第一个遇到的 "." ,以及其左侧的字符。

# website="www.zsythink.net"

# echo ${website#*.}

zsythink.net

#下例表示删除字符串中从左向右第一个遇到的 "//" ,以及其左侧的字符。

# website="https://ww.zsythink.net"

# echo ${website#*//}

ww.zsythink.net

掐头截取:删除字符串中从左向右最后一个遇到的char,以及其左侧的字符

##语法:${var##*char}

#下例表示删除字符串中从左向右最后一个遇到的 "/" ,以及其左侧的字符。

# website="https://ww.zsythink.net/index.html"

# echo ${website##*/}

index.html

#下例表示删除字符串中从左向右最后一个遇到的 "." ,以及其左侧的字符。

# website="www.zsythink.net"

# echo ${website##*.}

net

掐头去尾截取之去尾截取

去尾截取:删除字符串中从右向左第一个遇到的char,以及其右侧的字符

##语法:${var%char*}

#下例表示删除字符串中从右向左第一个遇到的 "/" ,以及其右侧的字符。

# testpath="/usr/local/nginx/conf.d"

# echo ${testpath%/*}

/usr/local/nginx

#下例表示删除字符串中从右向左第一个遇到的 "@" ,以及其右侧的字符。

# testmail="zsy@zsythink.net"

# echo ${testmail%@*}

zsy

去尾截取:删除字符串中从右向左最后一个遇到的char,以及其右侧的字符

##语法:${var%%char*}

#下例表示删除字符串中从右向左最后一个遇到的 "/" ,以及其右侧的字符。

# website="https://ww.zsythink.net/index.html"

# echo ${website%%/*}

https:

#下例表示删除字符串中从右向左最后一个遇到的 ":" ,以及其右侧的字符。

# testpasswd="root:x:0:0:root:/root:/bin/bash"

# echo ${testpasswd%%:*}

root

这篇文章就总结到这里,字符串的其他操作,我们会另总结为一篇文章。

希望这篇文章能够帮到你,常来呦~~亲~~~

linux 变量替换字符串,shell中常用的变量处理、字符串操作(之一)相关推荐

  1. shell中常用系统变量和条件判断

    常用系统变量 $0 当前程序的名称 $n 当前程序的第n个参数,n=1,2,-9 $* 当前程序的所有参数(不包括程序本身) $# 当前程序的参数个数(不包括程序本身) $$ 当前程序的PID $!  ...

  2. jquery 逗号分割截取字符串_Python中常用的8种字符串操作方法

    一.拼接字符串 使用"+"可以对多个字符串进行拼接 语法格式: str1 + str2 >>> str1 = "aaa">>> ...

  3. linux脚本除号,shell中常用的特殊符号整理

    在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `co ...

  4. linux 批量替换所有文件中包含的字符串

    sed -i "s/原来字符串/新字符串/g" `grep 原来字符串 -rl .`格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 ...

  5. linux脚本基本命令大全,Shell脚本常用命令

    Shell脚本常用命令 1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到" ...

  6. 在shell中常用的特殊符号

    在shell中常用的特殊符号罗列如下: # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $* \"string\"* **   ...

  7. shell中常用的基本命令

    shell中常用的基本命令 shell在企业中可以制作一些解放自己双手的小工具,更多的是对于数据的一种采集,对系统的健康状态进行一个初步的监控.使用起来比较简单.一般都是做单机,不然效率太低. 代码百 ...

  8. Shell中常用的通配符

    文章目录 1 Shell中常用的通配符 1 Shell中常用的通配符 通配符共有3个: "*","?","[]" * - 用于匹配文件名中任 ...

  9. c语言内生变量,在经济分析中常用的变量有内生变量与()。 A.存量 B.流量 C.变量 D.外生变量...

    在经济分析中常用的变量有内生变量与(). A.存量 B.流量 C.变量 D.外生变量 更多相关问题 车辆识别代码(VIN)编码的第十位表示的是检验代码. 患者女,26岁,下肢急性淋巴管炎,查体见肢体肿 ...

最新文章

  1. Bitmap too larget to be uploaded into a texture的解决方法
  2. 【Python】进制转换
  3. 初始化参数文件修改错误导致Oracle无法startup
  4. 软件质量管理体系 type:pdf_制造型企业构建完整的质量管理体系的思路要点
  5. php 扩展jpeg,php重新编译,gd扩展支持jpeg文件-Go语言中文社区
  6. 每日一练||第二周汇总
  7. android 点击文本框 不调用键盘,Android点击EditText文本框之外任何地方隐藏键盘的解决办法...
  8. visualroute 很棒的一款工具
  9. 第三代计算机的内存是,Intel正式发布Cooper Lake、第三代傲腾内存和新数据中心SSD...
  10. Spring Configuration Check Unmapped Spring configuration files found.Please configure Spring facet.
  11. java compar_Java中Comparable和Comparator
  12. c语言输入1显示你好,你好,求指教!该怎么用C语言的scanf实现一次输入若干个数据...
  13. c++ 的interface
  14. GitHub 9K Star!Apollo作者手把手教你微服务配置中心之道
  15. [组件笔记]7.UnityEngine.MonoBehaviour
  16. GitHub 上排名前 100 的 IOS 开源库介绍
  17. 【优化充电】基于matlab遗传算法求解电动汽车充电统一管理优化问题(含负荷功率曲线对比图及充电计划)【含Matlab源码 2300期】
  18. 微信小程序简单实现两列瀑布流布局页面
  19. 深度解析:大数据面前,统计学的价值在哪里?
  20. 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及超级分库分散并发方案(十六)...

热门文章

  1. 欧拉角速度和机体角速度
  2. 钢笔墨水能否代替打印机墨水_uv打印机喷头波形和墨水关系
  3. 零和博弈,囚徒困境,马斯洛需求层次理论
  4. php高性能框架phaicon,3分钟快速入门php高性能框架Phalcon
  5. 数字华容道(C++)
  6. react-router与react-reduct配合使用时页面不刷新问题解决方法
  7. 微信服务器是否记录视频信息,微信视频号有访客记录吗 微信视频号可以查看浏览记录吗...
  8. SpringBoot-21-统一日志框架
  9. android项目飞机大战,Android 项目之飞机大战
  10. kbd通达2017版破解后,自定义菜单无法调用表单开启流程/kbdkbd 错误,请联系管理员 /general/approve_center/new/insert.php/kbd