天天看点

引号与不按套路出牌

本文主要内容:

说服自己在字符串比较时,都要加上双引号!避免意外的发生!

在字符串比较时,如果用到扩展的正则表达式时,扩展正则表达式万万不要加引号!与其比较的变量必须要加上引号!此时不能用单中括号了,必须使用双中括号!!

不按套路出牌的脚本示例

在做字符串比较比较时,都要加上双引号!避免意外的发生!

在开始之前,我们还得学习一下引号的使用,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]+$ ]]都可以,此种方法可以用来判断是否变量是否为正整数,下面的脚本会上这种判断方法。

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

下面我们来完善添加用户的那个脚本,上一个脚本把人相像的太简单了,对于不按套路出牌的用户怎么应对呢?

原脚本:

修改后的脚本: