shell中常⽤的变量处理、字符串操作(之⼀)
  参考:
  在shell中,当我们已经获取到某个变量的变量值的时候,可能还需要对变量值进⾏⼀定的处理,才能到我们最终想要的结果,今天我们就来聊聊shell中常见的变量处理⽅法,我们通常会对变量进⾏如下处理。
  ⼀、获取变量的长度(字符串长度)。
  ⼆、对变量值进⾏截取(截取字符串)。
  三、替换变量值中的某段字符。
  四、删除变量值中的某段字符。
  五、对变量值进⾏⼤⼩写转换。
  六、当变量值为空时,对变量进⾏⼀些操作。
上述处理都是⼀些常见的操作,我们⼀个⼀个慢慢聊,这篇⽂章中,我们只对前两种操作进⾏总结,即怎样获取变量长度,以及怎样对变量值进⾏截取。
  ⼀、获取变量长度
  通常,我们有可能需要获取变量值的长度,⽐如,变量中存放了⼀个字符串,我们需要获取字符串的长度,则可以使⽤如下⽅法。
shell 字符串长度[root@node1 ~]# website="www.baidu"
[root@node1 ~]# echo $website
www.baidu
[root@node1 ~]# echo ${#website}
13
[root@node1 ~]#
  如上图所⽰,website变量的值为"www.baidu","www.baidu"字符串⼀共由16个字符组成,当输出${#website}时,即可输出变量website的长度,很简单吧。 
  ⼆、截取变量
  有时候,我们只是需要变量值中的某⼀段,所以,我们需要截取这段内容为我们所⽤。⽽截取变量的⽅法⼜有不少,我们⼀⼀道来。
  从指定位置开始截取字符串
  通常,我们需要从指定的位置开始截取字符串,截取到字符串的末尾,⽰例如下。
[root@node1 ~]# website="www.zsythink"
[root@node1 ~]# echo ${website:4}
zsythink
[root@node1 ~]#
  上例中的":4"表⽰从website变量值的第4个字符开始,截取到变量值的末尾。
  上例中的":0-4"表⽰从website变量值的倒数第4个字符开始,截取到变量值的末尾。
  从上例可以看出,":0-4"中的"0"可以使⽤"空格"代替,效果是相同的,但是,从上例中可以看出,"冒号"与"负号"之间如果不存在任何字符,则⽆法起到截取字符的效果,所以,上图中第三种写法是错误的。
  从指定位置开始截取字符串,并且指定截取字符的长度
  除了能够指定截取操作的开始位置,我们还能够指定截取的长度,⽐如,从变量的第4个字符开始截取,截取8个字符的长度,⽰例如下。
[root@node1 ~]# echo ${website:4:8}
zsythink
[root@node1 ~]#
  聪明如你⼀定想到了,我们能不能从倒数的位置开始,截取指定长度的字符呢?必须能的,⽰例如下。
  如上图所⽰,":0-12:9"表⽰从倒数第12个字符开始,向后截取9个字符,与之前的⽰例同理,"冒号"与"负号"之间如果不存在任何字符,则⽆法起到截取字符的效果,所以,上图中第三种写法是错误的。
  在上述⽰例中,我们指定了截取字符的长度,⽐如上例中的":0-12:9",表⽰截取9个字符的长度,其实,在centos7中,我们可以将截取字符的长度指定为"负数",但是注意,centos6中截取字符串的长度不能为"负数",否则会报错,我们来看看在centos7中,将截取长度指定为"负数"后的效果。⽰例如下
[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@node1 ~]# website="www.zsythink"
[root@node1 ~]# echo ${website:0-12}
zsythink
[root@node1 ~]# echo ${website:0-12:-4}
zsythink
  如上图所⽰,在centos7中,":0-12"表⽰从倒数第12个字符开始,向后截取所有字符,当同时指定截取长度为":-4"时,表⽰从倒数第12个字符向后截取所有字符以后,删除截取以后的字符的最后4个字符,换句话说,也可以理解成截取最后12个字符的前8个字符。
  但是,使⽤上述⽅法是需要注意⼀点,删除截取以后的字符数量不能⼤于现有字符的数量,⽰例如下。
[root@node1 ~]# echo ${website:0-12:-4}
zsythink
[root@node1 ~]# echo ${website:0-12:-11}
z
[root@node1 ~]# echo ${website:0-12:-12}
[root@node1 ~]# echo ${website:0-12:-13}
-bash: -13: ⼦串表达式 < 0
[root@node1 ~]#
  如上图所⽰,我们⼀共就截取了12个字符,如果将截取长度指定为"-13",则会报上述错误:-bash: XX : substring expression < 0
  注意:在centos7中,使⽤这种写法的时候要计算好截取的范围,否则会报错
  掐头去尾截取之掐头截取 
  所谓的"掐头去尾",其实就是删除某个字符左侧的所有字符(掐头),或者删除某个字符右侧的所有字符(去尾),这样说可能不容易理解,我们来看⼀些⼩例⼦,就能明⽩了。
  先从所谓的"掐头"聊起,⽰例如下。
[root@node1 ~]# website="www.zsythink"
[root@node1 ~]# echo ${website}
www.zsythink
[root@node1 ~]# echo ${website#*.}
zsythink
[root@node1 ~]#
  如上例所⽰,我们使⽤"#*."即可删除字符串中从左向右数第⼀个 "." 以及其左侧的全部字符,这就是所谓"掐头去尾"中的掐头,准确的说,应该是掐去头部,截取尾部。
  聪明如你⼀定已经会举⼀反三了,我们可以把上例中的 "." 替换成其他字符,也是同样适⽤的,⽰例如下。
[root@node1 ~]# teststr=bbAccAddAeeA
[root@node1 ~]# echo ${teststr#*A}
ccAddAeeA
[root@node1 ~]#
  如上图所⽰,"#*A"表⽰删除字符串中从左向右第⼀个遇到的A,以及其左侧的字符。
  换句话说,从左向右第⼀个遇到的A以及其左侧的字符都被当做"头部"掐去了。
  其实,除了能够使⽤"#*字符"的语法进⾏"掐头",其实还有另⼀种⽅法,也能实现"掐头"的操作,只不过它们略有些不同,⽰例如下。
[root@node1 ~]# website="www.zsythink"
[root@node1 ~]# echo ${website}
www.zsythink
[root@node1 ~]# echo ${website#*.}
zsythink
[root@node1 ~]# echo ${website##*.}
net
[root@node1 ~]#
  如上例所⽰,"##*."表⽰删除字符串中从左向右最后⼀个遇到的 "." ,以及其左侧的字符。
换句话说,从左向右最后⼀个遇到的 "." 以及其左侧的字符都被当做"头部"掐去了。
  没错,通过上例即可对⽐出两种写法的不同。
  "#*."表⽰删除字符串中从左向右第⼀个遇到的 "." ,以及其左侧的字符。
  "##*."表⽰删除字符串中从左向右最后⼀个遇到的 "." ,以及其左侧的字符。
  当然,上例中的"."也是可以根据实际情况替换成其他字符的,⽰例如下。
[root@node1 ~]# testpath="/usr/local/nginx/conf.d"
[root@node1 ~]# echo ${testpath}
/usr/local/nginx/conf.d
[root@node1 ~]# echo ${testpath##*/}
conf.d
[root@node1 ~]#
  掐头去尾截取之去尾截取
  与之前描述的"掐头截取"相似,只要理解了之前的⽰例,再来理解"去尾截取",简直不要太简单。
  我们先来看⼀个⼩⽰例。
[root@node1 ~]# testpath="/usr/local/nginx/conf.d"
[root@node1 ~]# echo ${testpath%/*}
/usr/local/nginx
[root@node1 ~]#
  如上图所⽰,"%/*"表⽰删除字符串中从右向左第⼀个遇到的 "/" ,以及其右侧的字符。
  换句话说,从右向左第⼀个遇到的 "/" 以及其右侧的字符都被当做"尾部"去掉了。
  举⼀反三,我们可以根据实际情况,将上例中的"/"替换成别的字符,⽰例如下。
[root@node1 ~]# echo ${website}
www.zsythink
[root@node1 ~]# echo ${website%.*}
www.zsythink
[root@node1 ~]#
  聪明如你,⼀定想到了,"去尾"截取法不⽌有上述⼀种⽅法,还有另⼀种"去尾"截取法,它们之间也略有不同,⽰例如下[root@node1 ~]# website="www.zsythink/index.html"
[root@node1 ~]# echo ${website}
www.zsythink/index.html
[root@node1 ~]# echo ${website%/*}
www.zsythink
[root@node1 ~]# echo ${website%%/*}
https:
[root@node1 ~]#
  上例中,"%%/*"表⽰删除字符串中从右向左最后⼀个遇到的 "/" ,以及其右侧的字符。
  换句话说,从右向左最后⼀个遇到的 "/" 以及其右侧的字符都被当做"尾部"去掉了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。