本文主要内容:
-
说服自己在字符串比较时,都要加上双引号!避免意外的发生!
-
在字符串比较时,如果用到扩展的正则表达式时,扩展正则表达式万万不要加引号!与其比较的变量必须要加上引号!此时不能用单中括号了,必须使用双中括号!!
-
不按套路出牌的脚本示例
在做字符串比较比较时,都要加上双引号!避免意外的发生!
在开始之前,我们还得学习一下引号的使用,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]+$ ]]都可以,此种方法可以用来判断是否变量是否为正整数,下面的脚本会上这种判断方法。
不按套路出牌的脚本示例:
下面我们来完善添加用户的那个脚本,上一个脚本把人相像的太简单了,对于不按套路出牌的用户怎么应对呢?
原脚本:
修改后的脚本: