shell 变量非空值,空值和不存在的辨别

============================================================
Author: hjjdebug
Date:     2018年 08月 24日 星期五 20:27:01 CST
============================================================
这里以ubuntu14 bash 为例,以实测为主,屏蔽掉网络上一些含糊不清的说法

------------------------------------------------------------
1. 怎样用 -n 来判断一个变量是否为空.
------------------------------------------------------------

实验:
$ a=""
$ [ -z $a ] && echo Null || echo NotNull
Null
$ [ -n $a ] && echo NotNull || echo Null
NotNull

-n 与 -z 顶牛了,-z说为空,-n说不为空,显然-n 说的是不对的,
那这个 -n 还有什么用? 是bug 吗?
下面有朋友指出了字符串变量应该用双引号括住,这样就能用-n 判断了.

$ [ -n "$a" ] && echo notNull || echo NULL
NULL

 

------------------------------------------------------------
2. -z 也有点近视眼,它分不清到底是空还是变量根本不存在.
------------------------------------------------------------
我们首先用 declare -p 命令确认b 变量是不存在的,然后继续以下实验
实验:
$ [ -z $b ] && echo Null || echo NotNull
Null
当然把不存在的变量当成Null 也未尝不可,也不是什么大事,不算bug,
因为它只有两个值,真或假,总不能当成非Null吧.!


------------------------------------------------------------
3. 如果你确实要知道该变量是空还是不存在,该怎么办呢?
------------------------------------------------------------
虽然这种要求一般是不需要甄别的,所以网上就有很多含混的说法,基本上不区分两种情况.
一定要区分时,可以参考如下实例使用
hjj@hjj-Inspiron:~$ echo ${a-NotDefine}

hjj@hjj-Inspiron:~$ echo ${b-NotDefine}
NotDefine
看到了吗? a是有定义的,它回传的是空,你只看到了一个空行
b 是无定义的它回传了"NotDefine"字符串。
借助于第三个变量例如c,判断其是否等于"NotDefine"就知道变量是否定义过。
这样把$a,$b的真实面目就区分开了!
这里的关键是利用了${var-default}格式区分了变量定义和未定义.


补充: 用=或 == 判断两个字符串相等的方式也不能判断是不存在还是为空值
a是存在的为空,b是不存在的。
$[ "$a" == "" ] && echo YES || echo NO
YES
$[ "$b" == "" ] && echo YES || echo NO
YES
分不清也有分不清的好处,这样容错性倒是加强了,因为大多数不用管到底是不存在空还是存在空.

 

你可能感兴趣的:(bash,编程)