字串切片 ${#var} : 返回字串變數var的長度
[root@centos6 ~]# alpha=`echo {a..z} |tr -d " "` \\建立一個變數將26個字母賦值進去,並且不要空格[root@centos6 ~]# echo $alphaabcdefghijklmnopqrstuvwxyz[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中的所有大寫字母轉換為小寫
變數賦值 var是一個變數,str也是一個變數,expr是一個運算式,可以是字串,這裡表達的意思是當str在沒有定義或定義為空白或定義了,對var變數的影響
[root@centos7 ~]# var=${line-"haha"} //當line有值時var的值就是line的值[root@centos7 ~]# echo $varroot: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