shell學(xué)習(xí)集合-shell第十三講
歡迎同學(xué)們來到馬哥教育官網(wǎng),今天和大家分享的文章是shell學(xué)習(xí)集合中的shell第十三講的內(nèi)容,我們一起來學(xué)習(xí)一下吧!
1、shell字符串比較符
1.1、==
==?可用于判斷變量是否相等,我們?cè)诖饲暗恼n程當(dāng)中也都給大家講過,字符串的比較建議使用[[ ]],因?yàn)槲覀冎苯訉?duì)字符串本身做比較的話,我們會(huì)習(xí)慣上對(duì)字符串加上雙引號(hào),比如:
bash [root@master1 ~]#[[ "you are a pig" == "you are a pig" ]] [root@master1 ~]#echo $? 0
兩個(gè)字符串是一模一樣的,比較上也是沒有問題的。但是我們?cè)诠ぷ髦型皇沁@么使用的,我們會(huì)將字符串賦值給一個(gè)變量,然后拿這個(gè)變量去跟目標(biāo)字符串做比較,這時(shí)候重點(diǎn)就來了,往往匹配上出現(xiàn)問題,比如會(huì)報(bào)這樣的錯(cuò)誤:test.sh: 第 4 行:[: 參數(shù)太多。這種錯(cuò)誤就讓我們很抓狂,我們明明寫的是沒有錯(cuò)誤的,但是卻不知道如何去排查 ‘’參數(shù)太多“ 這種問題。
所以這就是給大家強(qiáng)調(diào)的在進(jìn)行字符串比較時(shí)最好使用[[ ]],比如:
bash [root@master1 ~]#NAME="you are a pig" [root@master1 ~]#[[ $NAME == "you are a pig" ]] [root@master1 ~]#echo $? 0
大家都看明白了嗎?我們?cè)谝米兞?NAME,以這樣的方式跟字符串做相等比較,最好使用[[ ]]
當(dāng)然如果你非要使用[ ],那么引用變量 $NAME本身一定要加上雙引號(hào),即[ "$NAME" == "you are a pig" ],如果你就是不加雙引號(hào),否則就報(bào)test.sh: 第 4 行:[: 參數(shù)太多這樣的錯(cuò)誤直接懵逼了,
1.2、=
=本身我只是用做賦值操作,建議大家不要去用=來做字符串比較,因?yàn)楸容^詭異,而且Linux人大多數(shù)也都使用==來做比較,因此使用=本身做比較的同學(xué),我個(gè)人建議還是改變自己的操作,再說我們都使用==做比較了,再花心思研究=做字符串比較操作是沒有必要的,還浪費(fèi)精力。
1.3、!=
!=表示不等于,與==正好是相反,在shell腳本中我們也經(jīng)常使用它做一些字符串比較的操作。比如:
bash [root@master1 ~]#NAME="you are a pig" [root@master1 ~]#[[ $NAME != "you are a cat" ]] [root@master1 ~]#echo $? 0
兩個(gè)字符串確實(shí)是不相等的,條件為真,返回值為0。
1.4、-n與-z
-n和-z都是用來判斷字符串是否空的,不過兩者也是有區(qū)別的,如下所示:
| -n | 當(dāng)字符串長度不為0時(shí)條件為真,字符串長度為0時(shí)條件為假。 | | ------ | ------------------------------------------------------------ | |?-z?|?當(dāng)字符串長度不為0時(shí)條件為假,字符串長度為0時(shí)條件為真。?|
可以看出來-n與-z兩個(gè)功能正好相反,比如:
bash [root@master1 ~]#NAME="" [root@master1 ~]#[ -n "$NAME" ] [root@master1 ~]#echo $? 1 [root@master1 ~]#[ -z "$NAME" ] [root@master1 ~]#echo $? 0
我們現(xiàn)在賦值NAME變量值的長度為0,然后分別使用-n和-z來測試,發(fā)現(xiàn)符合我們的預(yù)期,NAME變量確實(shí)長度為0,?-z判斷長度為0,條件為真,返回值為0。
現(xiàn)在我們測試一個(gè)字符串變量長度不為0的情況,我們給NAME變量賦個(gè)字符串值,比如:
bash [root@master1 ~]#NAME="you are a pig" [root@master1 ~]#[ -z "$NAME" ] [root@master1 ~]#echo $? 1 [root@master1 ~]#[ -n "$NAME" ] [root@master1 ~]#echo $? 0
同樣的,現(xiàn)在NAME變量有字符串值,此時(shí)-z發(fā)現(xiàn)字符串長度不為0,條件為假,返回值為1。
當(dāng)然大家發(fā)現(xiàn)了上面的引用變量本身需要加上雙引號(hào),很多人還是不習(xí)慣加的,那么此時(shí)你會(huì)得不到想要的結(jié)果,此時(shí)在判斷上是有錯(cuò)誤的,不信你可以試試看。當(dāng)然也可以解決,就是使用[[ ]]來解決,比如:
bash [root@master1 ~]#NAME="you are a pig" [root@master1 ~]#[[ -z $NAME ]] [root@master1 ~]#echo $? 1 [root@master1 ~]#NAME="" [root@master1 ~]#[[ -z $NAME ]] [root@master1 ~]#echo $? 0
大家看到效果了嗎?這就是使用[[ ]]的好處。
聲明:文章來源于網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系刪除!