引號與不按套路出牌

本文主要內容:

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

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

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

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

在開始之前,我們還得學習一下引號的使用,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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章