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

  • Post author:
  • Post category:其他


============================================================

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 判断了.

我跟踪了一下test 代码(等同于 [ 代码), 只所以出现这种情况,是因为当a=””是,

test -n $a 并没有传进2个参数,而只是传进了一个参数 -n, $a给忽略了,结果返回值总是成功.

而加上”$a”, 则bash 传进去了2个参数,才能得到正确的判定结果。

所以说,对于2参数的判断,后边还是加上双引号””靠谱。

$ [ -n “$a” ] && echo notNull || echo NULL

NULL

————————————————————

2. -z 也有点近视眼,它分不清到底是空还是变量根本不存在.

————————————————————

我们首先用 declare -p 命令确认b 变量是不存在的,然后继续以下实验

实验:

$ [ -z $b ] && echo Null || echo NotNull

Null

$b不加双引号相当于该参数不存在,相当于只有-z 一个参数,其返回值是成功

$ [ -z “$b” ] && echo Null || echo NotNull

Null

$b 加双引号”$b”, 因$b不存在,传进去的是空,所以用-z 测试其返回值是成功

加双引号的写法是正规的.

如果 a变量存在,a=””, 那用-z 测试也是返回成功

$ [ -z “$a” ] && echo Null || echo NotNull

Null


————————————————————

3. 如果你确实要知道该变量是空还是不存在,该怎么办呢?

————————————————————

虽然这种要求一般是不需要甄别的,所以网上就有很多含混的说法,基本上不区分两种情况.

一定要区分时,可以参考如下实例使用

hjj@hjj-Inspiron:~$ echo ${a-NotDefine}

hjj@hjj-Inspiron:~$ echo ${b-NotDefine}

NotDefine

看到了吗? a是有定义的,它回传的是空,你只看到了一个空行

b 是无定义的它回传了”NotDefine”字符串。

这样把$a,$b的真实面目就区分开了!

这里的关键是利用了${var-default}格式区分了变量定义和未定义.

${var-} 的意义是有值传值(包括空值), 未定义传default字符串.


补充: 用=或 == 判断两个字符串相等的方式也不能判断是不存在还是为空值

a是存在的为空,b是不存在的。

$[ “$a” == “” ] && echo YES || echo NO

YES

$[ “$b” == “” ] && echo YES || echo NO

YES

分不清也有分不清的好处,这样容错性倒是加强了,因为大多数不用管到底是不存在空还是存在空.



版权声明:本文为hejinjing_tom_com原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。