在做shell批處理程式時候,經常會涉及到字元串相關操作。有很多指令語句,如:awk,sed都可以做字元串各種操作。 其實shell内置一系列操作符号,可以達到類似效果,大家知道,使用内部操作符會省略啟動外部程式等時間,是以速度會非常的快。
一、判斷讀取字元串值
表達式
含義
${var}
變量var的值, 與$var相同
${var-DEFAULT}
如果var沒有被聲明, 那麼就以$DEFAULT作為其值 *
${var:-DEFAULT}
如果var沒有被聲明, 或者其值為空, 那麼就以$DEFAULT作為其值 *
${var=DEFAULT}
如果var沒有被聲明, 那麼就以$DEFAULT作為其值 *
${var:=DEFAULT}
如果var沒有被聲明, 或者其值為空, 那麼就以$DEFAULT作為其值 *
${var+OTHER}
如果var聲明了, 那麼其值就是$OTHER, 否則就為null字元串
${var:+OTHER}
如果var被設定了, 那麼其值就是$OTHER, 否則就為null字元串
${var?ERR_MSG}
如果var沒被聲明, 那麼就列印$ERR_MSG *
${var:?ERR_MSG}
如果var沒被設定, 那麼就列印$ERR_MSG *
${!varprefix*}
比對之前所有以varprefix開頭進行聲明的變量
${!varprefix@}
比對之前所有以varprefix開頭進行聲明的變量
加入了“*” 不是意思是: 當然, 如果變量var已經被設定的話, 那麼其值就是$var.
[[email protected] ~]$ echo ${abc-'ok'}
ok
[[email protected] ~]$ echo $abc
[[email protected] ~]$ echo ${abc='ok'}
ok
[[email protected] ~]$ echo $abc
ok
如果abc 沒有聲明“=" 還會給abc指派。
[[email protected] ~]$ var1=11;var2=12;var3=
[[email protected] ~]$ echo ${!v@}
var1 var2 var3
[[email protected] ~]$ echo ${!v*}
var1 var2 var3
${!varprefix*}與${!varprefix@}相似,可以通過變量名字首字元,搜尋已經定義的變量,無論是否為空值。
二、字元串操作(長度,讀取,替換)
表達式
含義
${#string}
$string的長度
${string:position}
在$string中, 從位置$position開始提取子串
${string:position:length}
在$string中, 從位置$position開始提取長度為$length的子串
${string#substring}
從變量$string的開頭, 删除最短比對$substring的子串
${string##substring}
從變量$string的開頭, 删除最長比對$substring的子串
${string%substring}
從變量$string的結尾, 删除最短比對$substring的子串
${string%%substring}
從變量$string的結尾, 删除最長比對$substring的子串
${string/substring/replacement}
使用$replacement, 來代替第一個比對的$substring
${string//substring/replacement}
使用$replacement, 代替所有比對的$substring
${string/#substring/replacement}
如果$string的字首比對$substring, 那麼就用$replacement來代替比對到的$substring
${string/%substring/replacement}
如果$string的字尾比對$substring, 那麼就用$replacement來代替比對到的$substring
說明:"* $substring”可以是一個正規表達式.
1.長度
[[email protected] ~]$ test='I love china'
[[email protected] ~]$ echo ${#test}
12
${#變量名}得到字元串長度
2.截取字串
[[email protected] ~]$ test='I love china'
[[email protected] ~]$ echo ${test:5}
e china
[[email protected] ~]$ echo ${test:5:10}
e china
${變量名:起始:長度}得到子字元串
3.字元串删除
[[email protected] ~]$ test='c:/windows/boot.ini'
[[email protected] ~]$ echo ${test#/}
c:/windows/boot.ini
[[email protected] ~]$ echo ${test#*/}
windows/boot.ini
[[email protected] ~]$ echo ${test##*/}
boot.ini
[[email protected] ~]$ echo ${test%},${test%/}
得到的結果為www.你的域名.com/cut-string.html,即删除從左邊開始到第一個"//"及其左邊所有字元
2、使用 ## 号操作符。用途是從左邊開始删除最後一次出現子字元串即其左邊字元,保留右邊字元。用法為##*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str##*/}
得到的結果為cut-string.html,即删除最後出現的"/"及其左邊所有字元
3、使用 % 号操作符。用途是從右邊開始删除第一次出現子字元串即其右邊字元,保留左邊字元。用法為%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%/*}
得到的結果為http://www.你的域名.com,即删除從右邊開始到第一個"/"及其右邊所有字元
4、使用 %% 号操作符。用途是從右邊開始删除最後一次出現子字元串即其右邊字元,保留左邊字元。用法為%%substr*,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%%/*}
得到的結果為http://www.你的域名.com,即删除從右邊開始到最後一個"/"及其右邊所有字元第二種也分為四種,分别介紹如下:
1、從左邊第幾個字元開始以及字元的個數,用法為:start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:0:5}
其中的 0 表示左邊第一個字元開始,
5 表示字元的總個數。
結果是:http:
2、從左邊第幾個字元開始一直到結束,用法為:start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:7}
其中的 7 表示左邊第8個字元開始
結果是:www.你的域名.com/cut-string.html
3、從右邊第幾個字元開始以及字元的個數,用法:0-start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-15:10}
其中的 0-6 表示右邊算起第6個字元開始,10 表示字元的個數。
結果是:cut-string3、從右邊第幾個字元開始一直到結束,用法:0-start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-4}
其中的 0-6 表示右邊算起第6個字元開始,10 表示字元的個數。
結果是:html注:(左邊的第一個字元是用 0 表示,右邊的第一個字元用 0-1 表示)
網上其它參考内容
一、Linux shell 截取字元變量的前8位,有方法如下:
1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘(.\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null
二、按指定的字元串截取
1、第一種方法:
${varible##*string} 從左向右截取最後一個string後的字元串
${varible#*string}從左向右截取第一個string後的字元串
${varible%%string*}從右向左截取最後一個string後的字元串
${varible%string*}從右向左截取第一個string後的字元串
“*”隻是一個通配符可以不要
例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg
2、第二種方法:${varible:n1:n2}:截取變量varible從n1到n2之間的字元串。
可以根據特定字元偏移和長度,使用另一種形式的變量擴充,來選擇特定子字元串。試着在 bash 中輸入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
這種形式的字元串截斷非常簡便,隻需用冒号分開來指定起始字元和子字元串長度。
三、按照指定要求分割: 比如擷取字尾名 ls -al | cut -d “.” -f2