字符串切片
- ${#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字符之間的所有字符
${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 $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