shell-脚本-字符串切片

字符串切片

  • ${#var} : 返回字符串变量var的长度
[root@centos6 ~]# alpha=`echo {a..z} |tr -d " "`  \\创建一个变量将26个字母赋值进去,并且不要空格
[root@centos6 ~]# echo $alpha
abcdefghijklmnopqrstuvwxyz
[root@centos6 ~]# echo ${#alpha}  \\查看变量的字符有多少个
26
  • ${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0到${#var}-1之间(bash4.2后,允许为负值)
[root@centos6 ~]# echo ${alpha:3} //跳过前3个显示后面全部
defghijklmnopqrstuvwxyz
  • ${var:offset:number}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
[root@centos6 ~]# echo ${alpha:3:4}   \\跳过3个取4个
defg
  • ${var: -length}:取字符串的最右侧几个字符
    • 注意:冒号后必须有一个空白字符
[root@centos6 ~]# echo ${alpha: -3}
xyz
  • ${var:offset:-length}: 从最左侧跳过offset字符,一直向右取到距离最右侧length个字符之前的内容
[root@centos6 ~]# echo ${alpha:3:-4}   //centos6不支持这种写法
-bash: -4: substring expression < 0
[root@centos7 ~]# echo ${alpha:3:-4}  //7上是可以的,取前3个到倒数第4个之间的
defghijklmnopqrstuv
  • ${var: -length:-offset}:先从最右侧向左取到length个字符开始,在向右取到距离最右侧offset个字符之间的内容
    • 注意:-length前的空格
[root@centos7 ~]# echo ${alpha: -3:-2}  \\取倒数3个但是最后又2个不要
x
[root@centos7 ~]# echo ${alpha: -5:-2}  \\前面的数字一定要比后面的数字大
vwx

字符串处理

  • 基于模式取子符串
    • ${var#*word}:其中word可以是指定任意字符
    • 功能:自左向右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符
      bash
      [root@centos7 ~]# echo ${alpha#*v}
      wxyz
      [root@centos7 ~]# echo ${alpha#*w}
      xyz
      [root@centos7 ~]# line=`getent passwd root`
      [root@centos7 ~]# echo $line
      root:x:0:0:root:/root:/bin/bash
      [root@centos7 ~]# echo ${line#*root}
      :x:0:0:root:/root:/bin/bash
    • ${var##*word}:同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由work指定的字符之间的所有内容
      bash
      [root@centos7 ~]# echo ${line##*root}
      :/bin/bash

      示列
file="var/log/messages“
${file#*/}: log/messages
${file##*/}: messages
  • ${var%word*}:其中word可以是指定的任意字符;
    • 功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符
      bash
      [root@centos7 ~]# echo ${line%root*}
      root:x:0:0:root:/
  • ${var%%word*}:同上,只不过删除字符串最右侧的字符向左直至最后一次出现word字符之间的所有字符

    [root@centos7 ~]# echo ${line%%root*}
    

    示列

url=http://www.magedu.com:80
${url##*:} 80
${url%%:*} http

查找替换

  • ${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之
[root@centos7 ~]# echo ${line/root/admin}
admin:x:0:0:root:/root:/bin/bash
  • ${var//pattern/substr}:查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之
[root@centos7 ~]# echo ${line//root/admin}
admin:x:0:0:admin:/admin:/bin/bash
  • ${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
[root@centos7 ~]# echo ${line/#root/admin}
admin:x:0:0:root:/root:/bin/bash
  • ${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
[root@centos7 ~]# echo ${line/%bash/admin}
root:x:0:0:root:/root:/bin/admin

查找并删除

  • ${var/pattern}:删除var所表示的字符串中第一次被pattern所匹配到的字符串
[root@centos7 ~]# echo ${line/root}
:x:0:0:root:/root:/bin/bash
[root@centos7 ~]# echo ${line/root/}   //查找替换也可以就是查找用空代替
:x:0:0:root:/root:/bin/bash
  • ${var//pattern}:删除var所表示的字符串中所有被pattern所匹配到的字符串
[root@centos7 ~]# echo ${line//root}
:x:0:0::/:/bin/bash
  • ${var/#pattern}:删除var所表示的字符串中所有以pattern为行首所匹配到的字符串
[root@centos7 ~]# echo ${line/#root}
:x:0:0:root:/root:/bin/bash
  • ${var/%pattern}:删除var所表示的字符串中有所以pattern为行尾所匹配到的字符串
[root@centos7 ~]# echo ${line/#root}
:x:0:0:root:/root:/bin/bash

字符大小写转换

  • ${var^^}:把var中的所有小写字母转换为大写
[root@centos7 ~]# echo ${line^^}
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
[root@centos7 ~]# echo ${line}   //但是变量里是没有变的只是显示变了
root:x:0:0:root:/root:/bin/bash
  • ${var,,}:把var中的所有大写字母转换为小写

变量赋值

  • mark
  • var是一个变量,str也是一个变量,expr是一个表达式,可以是字符串,这里表达的意思是当str在没有定义或定义为空或定义了,对var变量的影响
[root@centos7 ~]# var=${line-"haha"}  //当line有值时var的值就是line的值
[root@centos7 ~]# echo $var
root:x:0:0:root:/root:/bin/bash
[root@centos7 ~]# line=""
[root@centos7 ~]# var=${line-"haha"}  //当line的值为空时var的值就是line的值
[root@centos7 ~]# echo $var         

[root@centos7 ~]# unset line
[root@centos7 ~]# var=${line-"haha"}   //当line没有定义时var的值就是haha
[root@centos7 ~]# echo $var         
haha

高级变量用法-有类型变量


  • shell变量一般是无类型的,但是bash shell提供了declare和typeset(将要淘汰)两个命令用于指定变量的类型,两个命令是等价的
  • bash不支持浮点数就是小数点

declare [选项] 变量名
-r 声明或显示只读变量
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示已定义的所有函数名及其内容
-F 仅显示已定义的所有函数名
-x 声明或显示环境变量和函数
-l 声明变量为小写字母 declare  -l var=UUPER

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章