本文主要內容:
說服自己在字符串比較時,都要加上雙引號!避免意外的發生!
在字符串比較時,如果用到擴展的正則表達式時,擴展正則表達式萬萬不要加引號!與其比較的變量必須要加上引號!此時不能用單中括號了,必須使用雙中括號!!
不按套路出牌的腳本示例
在做字符串比較比較時,都要加上雙引號!避免意外的發生!
在開始之前,我們還得學習一下引號的使用,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時用不用引號沒什麼影響!
0
[root@linuxprobe ~]# a=
[root@linuxprobe ~]# [ -n $a ];echo $? #what?這裏問它不是空的嗎?這裏的a是空的,應該返回爲1,但是卻返回了0! -n時就出了問題! 使用引號可解決這種不正常。
0
[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [ -n $a ];echo $? #
0
######################我是加引號與不加引號的分隔線#########################
[root@linuxprobe ~]# a=
[root@linuxprobe ~]# [ -n "$a" ];echo $? #看這就變正常了
1
[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [ -n "$a" ];echo $?
0
結論:
做字符串的判斷時,在中括號內部都要加上引號,避免意外的發生,將意外扼殺在萌芽之中!
在字符串比較時,如果用到擴展的正則表達式時,擴展正則表達式萬萬不要加引號!與其比較的變量必須要加上引號!此時不能用單中括號了,必須使用雙中括號!!
[root@linuxprobe ~]# a=1
[root@linuxprobe ~]# [[ "$a" =~ ^[[:digit:]]+$ ]];echo $?
0
[root@linuxprobe ~]# [[ "$a" =~ ^[0-9]+$ ]];echo $?
0
[root@linuxprobe ~]# a=1b1
[root@linuxprobe ~]# [[ "$a" =~ ^[[:digit:]]+$ ]];echo $?
1
[root@linuxprobe ~]# [[ "$a" =~ ^[0-9]+$ ]];echo $?
1
如果要使用擴展的正則表達式就必須得使用雙中括號,而且還得使用專門的判斷符號=~,在字符串比較裏面是不支持標準的正則表達式的!一用就報錯(我就是你,你還不相信嗎?)
數字用擴展的正則表達式如果表示?就是用^[[:digit:]]+$ ]或者^[0-9]+$ ]]都可以,此種方法可以用來判斷是否變量是否爲正整數,下面的腳本會上這種判斷方法。
不按套路出牌的腳本示例:
下面我們來完善添加用戶的那個腳本,上一個腳本把人相像的太簡單了,對於不按套路出牌的用戶怎麼應對呢?
原腳本:
#!/bin/bash #author:zhanghe read -p "please input one username prefix:" PREFIX read -p "please input creat user number:" NUMBER for i in `seq $NUMBER`;do user=$PREFIX$i if ! id $user &>/dev/null;then useradd $user &>/dev/null echo 123 | passwd --stdin $user &>/dev/null chage -d 0 $user echo "$user 已經添加~,密碼默認爲123,已經強制用戶第一次登錄修改密碼" else echo "$user已經存在,無需添加!" fi done
修改後的腳本:
[root@linuxprobe scripts]# vim useradd.sh #!/bin/bash #author:zhanghe read -p "please input one username prefix:" PREFIX if [ -z "$PREFIX" ];then echo "error PREFIX" exit 1 fi read -p "please input creat user number:" NUMBER if [[ ! "$NUMBER" =~ ^[[:digit:]]+$ ]];then echo "error number! ,you must input signless integer" exit 2 fi for i in `seq $NUMBER`;do user=$PREFIX$i if ! id $user &>/dev/null;then useradd $user &>/dev/null echo 123 | passwd --stdin $user &>/dev/null chage -d 0 $user echo "$user 已經添加~,密碼默認爲123,已經強制用戶第一次登錄修改密碼" else echo "$user已經存在,無需添加!" fi don