網(wǎng)站移動頁面怎么做百度新聞發(fā)布平臺
expr命令可以實現(xiàn)數(shù)值運算、數(shù)值或字符串比較、字符串匹配、字符串提取、字符串長度計算等功能。它還具個特殊功能,判斷變量或參數(shù)是否為整數(shù)、是否為空、是否為0等。
1.字符串表達(dá)式
-------------------------
'expr'支持模式匹配和字符串操作。字符串表達(dá)式的優(yōu)先級高于數(shù)值表達(dá)式和邏輯關(guān)系表達(dá)式。'STRING : REGEX'執(zhí)行模式匹配。兩端參數(shù)會轉(zhuǎn)換為字符格式,且第二個參數(shù)被視為正則表達(dá)式(GNU基本正則),它默認(rèn)REGEX中隱含了"^",所以使得匹配時都是從string首字符開始的。隨后將第一個參數(shù)和正則模式做匹配。 如果匹配成功,且REGEX使用了'\('和'\)',則此表達(dá)式返回匹配到的,如果未使用'\('和'\)',則返回匹配的字符數(shù)。 如果匹配失敗,如果REGEX中使用了'\('和'\)',則此表達(dá)式返回空字符串,否則返回為0。 只有第一個'\(...\)'會引用返回的值;其余的'\(...\)'只在正則表達(dá)式分組時有意義。 在正則表達(dá)式中,'\+','\?'和'\|'分表代表匹配一個或多個,0個或1個以及兩端任選其一的意思。]# expr "ab->cd" : ".*-" #沒有\(zhòng)(\),若正則匹配,只返回匹配的字符串長度3]# expr "ab->cd" : ".*->" #沒有\(zhòng)(\),若正則匹配,只返回匹配的字符串長度4]# expr "ab->cd" : ".\+" #沒有\(zhòng)(\),若正則匹配,只返回匹配的字符串長度6]# expr "ab->cd" : "\(.*\)->\(.*\)" #有多個\(\),若正則匹配,只返回第一個\(\)內(nèi)容ab]# expr "ab->cd" : "\(a.\)"ab
'match STRING REGEX'等價于'STRING : REGEX'。]# expr match "ab->cd" "\(.*b.*\)"ab->cd
'substr STRING POSITION LENGTH'返回STRING字符串中從POSITION開始,長度最大為LENGTH的子串。如果POSITION或LENGTH為負(fù)數(shù),0或非數(shù)值,則返回空字符串。]# expr substr "ab->cd" 3 2->
'index STRING CHARSET'CHARSET中任意單個字符在STRING中最前面的字符位置。如果在STRING中完全不存在CHARSET中的字符,則返回0。見后文示例。]# expr index "ab->cd" "-"3//該命令將對字符串"dec"逐字符分解,首先分解得到第一個字符d,從abcde中搜索到d的位置為4,再分解得到第二個字符e,該字符在abcde中的位置為5,最后得到的字符是c,該字符在abcde中的位置為3。其中3是最靠前的字符,所以命令返回的結(jié)果為3。]# expr index abcde dec3 ]# expr index abcde 1 //如果chars中的所有字符都不存在于string中,則返回0。0
'length STRING'返回STRING的字符長度。其中string不允許為空,否則將報錯]# expr length "ab->cd"6
'+ TOKEN'expr中有些符號和關(guān)鍵字有特殊意義,如"match"、"index"、"length",如果要讓其成為字符,使用該表達(dá)式將任意token強(qiáng)制解析為普通字符串。]# expr + "substr" : "\(s.*\)"substr]# expr length + "substr"6要讓expr將關(guān)鍵字解析為普通的字符,必須使用引號包圍。2.算術(shù)表達(dá)式
--------------------------
'expr'支持普通的算術(shù)操作,算術(shù)表達(dá)式優(yōu)先級低于字符串表達(dá)式,高于邏輯關(guān)系表達(dá)式。
'+ -'加減運算。兩端參數(shù)會轉(zhuǎn)換為整數(shù),如果轉(zhuǎn)換失敗則報錯。]# expr 3 + 47]# expr 3 - 4-1
'* / %'乘,除,取模運算。兩端參數(shù)會轉(zhuǎn)換為整數(shù),如果轉(zhuǎn)換失敗則報錯。算術(shù)乘法符號"*"因為是shell的元字符,所以要轉(zhuǎn)義,可以使用引號包圍,或者使用反斜線]# expr 4 \* 312]# expr 4 / 31]# expr 4 % 313.邏輯關(guān)系表達(dá)式
---------------------------
'expr'支持普通的邏輯連接和邏輯關(guān)系。它的優(yōu)先級最低。'|'|需要轉(zhuǎn)義\|,或使用引號包圍'|'正確的應(yīng)該是:如果第一個參數(shù)非0,則返回第一個參數(shù)的值,否則返回第二個參數(shù)。但如果任意一個參數(shù)為空,則報錯。除非空字符串使用引號包圍,此時將和0的處理方式一樣。]# expr 1 '|' 21]# expr 1 '|' 01]# expr 0 '|' 11# expr 0 '|' 00]# expr $ab '|' 1 #$ab為空expr: syntax error]# expr "$ab" '|' 1 #"$ab"為空字符串,相當(dāng)于01
'&' &需要轉(zhuǎn)義\&,或使用引號包圍'&'如果兩個參數(shù)都非0,則返回第一個參數(shù),否則返回0。但任意一個參數(shù)為空,則報錯。除非空字符串使用引號包圍,此時將和0的處理方式一樣。]# expr 1 '&' 00]# expr 1 '&' 21]# expr 1 '&' 00]# expr 0 '&' 10]# expr $ab '&' 1 #$ab為空,報錯expr: syntax error]# expr "$ab" '&' 1 #"$ab"為空字符,相當(dāng)于00
'< <= = == != >= >'比較兩端的參數(shù),如果為true,則返回1,否則返回0。"=="是"="的同義詞。"expr"首先嘗試將兩端參數(shù)轉(zhuǎn)換為整數(shù),并做算術(shù)比較,如果轉(zhuǎn)換失敗,則按字符集排序規(guī)則做字符比較。比較操作符< <= = == != >= >用法示例。其中"<"和">"是正則表達(dá)式正的錨定元字符,且"<"會被shell解析為重定向符號,所以需要轉(zhuǎn)義或用引號包圍。這些操作符會首先會將兩端的參數(shù)轉(zhuǎn)換為數(shù)值,如果轉(zhuǎn)換成功,則采用數(shù)值比較,如果轉(zhuǎn)換失敗,則按照字符集的排序規(guī)則進(jìn)行字符大小比較。 括號'()'可以改變優(yōu)先級,但使用時需要使用反斜線對括號進(jìn)行轉(zhuǎn)義。]# expr 4 '*' 4 - 10 '>=' 6 1]# expr 4 '*' \( 4 - 10 \) '>=' 6 04.'expr'使用示例
-------------------------------
以下為expr的一些示例,其中有將shell的元字符使用引號包圍的示例。 將shell中變量'foo'的值增加1: foo=$(expr $foo + 1)輸出變量路徑變量'$fname'中不包含'/'的文件名部分: expr "$fname" : '.*/\(.*\)' '|' "$fname" 解釋:其中的'|'是expr中的連接符,只不過是被引號包圍防止被shell解析。例如$fname=/etc/hosts,則此表達(dá)式返回hosts,如果$fname=/usr/share/,則此表達(dá)式'|'的左邊為空,所以返回'|'右邊的值,即$fname,即返回/usr/share/。An example showing that '\+' is an operator: expr aaa : 'a\+' # 解釋:因為REGEX部分沒有使用\(\),所以返回匹配的字符數(shù)=> 3 expr abc : 'a\(.\)c' # 解釋:因為REGEX部分使用了\(\),所以返回匹配的字符=> bexpr index abcdef cz=> 3expr index index a # 解釋:因為第二個index是關(guān)鍵字error-> expr: syntax errorexpr index + index a # 解釋:使用+將index關(guān)鍵字解析為普通字符串=> 0