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

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