天天看點

引号與不按套路出牌

本文主要内容:

說服自己在字元串比較時,都要加上雙引号!避免意外的發生!

在字元串比較時,如果用到擴充的正規表達式時,擴充正規表達式萬萬不要加引号!與其比較的變量必須要加上引号!此時不能用單中括号了,必須使用雙中括号!!

不按套路出牌的腳本示例

在做字元串比較比較時,都要加上雙引号!避免意外的發生!

在開始之前,我們還得學習一下引号的使用,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]+$ ]]都可以,此種方法可以用來判斷是否變量是否為正整數,下面的腳本會上這種判斷方法。

不按套路出牌的腳本示例:

下面我們來完善添加使用者的那個腳本,上一個腳本把人相像的太簡單了,對于不按套路出牌的使用者怎麼應對呢?

原腳本:

修改後的腳本: