本文主要内容:
說服自己在字元串比較時,都要加上雙引号!避免意外的發生!
在字元串比較時,如果用到擴充的正規表達式時,擴充正規表達式萬萬不要加引号!與其比較的變量必須要加上引号!此時不能用單中括号了,必須使用雙中括号!!
不按套路出牌的腳本示例
在做字元串比較比較時,都要加上雙引号!避免意外的發生!
在開始之前,我們還得學習一下引号的使用,what?引号的使用不是再剛開始學腳本的時候就已經 學習了嗎?對此,我之前對你說,太年輕,shell腳本的世界裡引号的使用絕非那麼簡單!
我們在前面講過了條件測試時的格式,說了它對中括号情有獨鐘,但是對裡面的引号問題還沒有深入學習!我們下面就來學習一下,come on -------->!
那麼在條件測試判斷裡面什麼時候該用雙引号?什麼時候不用加雙引号呢?一言以蔽之:當其是字元串的時候當用雙引号,當其是正規表達式千萬不能用雙引号!
先說第一條:做字元串比較判斷時當用引号把字元串引起來。
-z是問變量内部是空的嗎?是空的傳回0,不是空的傳回1
-n是問變量内部不是空的嗎?不是空的的傳回0,是空的傳回1
[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [ -z $a ];echo $? #不是空的傳回1
1
[root@linuxprobe ~]# a=
[root@linuxprobe ~]# [ -z $a ];echo $? #是空的傳回0,在-z時用不用引号沒什麼影響!
[root@linuxprobe ~]# [ -n $a ];echo $? #what?這裡問它不是空的嗎?這裡的a是空的,應該傳回為1,但是卻傳回了0! -n時就出了問題! 使用引号可解決這種不正常。
[root@linuxprobe ~]# [ -n $a ];echo $? #
######################我是加引号與不加引号的分隔線#########################
[root@linuxprobe ~]# [ -n "$a" ];echo $? #看這就變正常了
[root@linuxprobe ~]# [ -n "$a" ];echo $?
結論:
做字元串的判斷時,在中括号内部都要加上引号,避免意外的發生,将意外扼殺在萌芽之中!
[root@linuxprobe ~]# [[ "$a" =~ ^[[:digit:]]+$ ]];echo $?
[root@linuxprobe ~]# [[ "$a" =~ ^[0-9]+$ ]];echo $?
[root@linuxprobe ~]# a=1b1
如果要使用擴充的正規表達式就必須得使用雙中括号,而且還得使用專門的判斷符号=~,在字元串比較裡面是不支援标準的正規表達式的!一用就報錯(我就是你,你還不相信嗎?)
數字用擴充的正規表達式如果表示?就是用^[[:digit:]]+$ ]或者^[0-9]+$ ]]都可以,此種方法可以用來判斷是否變量是否為正整數,下面的腳本會上這種判斷方法。
不按套路出牌的腳本示例:
下面我們來完善添加使用者的那個腳本,上一個腳本把人相像的太簡單了,對于不按套路出牌的使用者怎麼應對呢?
原腳本:
修改後的腳本: