请澄清关于在bash

时间:2017-08-23 13:48:15

标签: bash

我正在阅读bash的基础知识,我对测试或[..]命令的-z-n选项有疑问。

如果[-z $var ]为空或空,则AFAIK $var返回true 如果[-n $var ]非空,则$var会返回true。

但我有以下输出

[root@localhost ~]# COLUMNS="";[ -z $COLUMNS ] && echo tru || echo fals
tru
[root@localhost ~]# COLUMNS="abc";[ -z $COLUMNS ] && echo tru || echo fals
fals
[root@localhost ~]# COLUMNS="abc";[ -n $COLUMNS ] && echo tru || echo fals
tru
[root@localhost ~]# COLUMNS="";[ -n $COLUMNS ] && echo tru || echo fals
tru
[root@localhost ~]# COLUMNS="abc";[ -n $COLUMN ] && echo tru || echo fals
tru

有人可以解释,为什么第四行在变量为空时返回true? 我没有设置COLUMN的值,但是,第五行仍然返回true? 有人可以通过举例说明在什么情况下[ -n $var ]会返回错误吗?

2 个答案:

答案 0 :(得分:2)

使用单[测试变量时,必须在双引号之间进行扩展,以防止分词。

由于[[是shell关键字,bash可以处理变量扩展而无需双引号。

-n和-z需要第二个参数,该参数可以为null(空),但因为变量周围缺少双引号,所以在分词后没有参数。

比较以下两个命令

[ -n ]  && echo ok     #  or [ -n $varname ]
[ -n "" ]  && echo ok  #  or [ -n "$varname" ]
  • 如果参数的数量为1,则如果参数不为空则结果为真

实施例

[ '' ] # false
[ '-z *6548*-' ] # true
  • 如果参数的数量是2,那么第一个必须是一元运算符

实施例

[ "arg1" "arg2" ] # arg1: unary operator expected
[ -z '' ] # true
  • 如果参数的数量是3,那么第二个必须是二元运算符

实施例

[ "arg1" "arg2" "arg3" ] # arg2: binary operator expected
[ "abc" != "def" ] # true

使用参数扩展

设置另一种检查变量的方法,而不是为空
[ -n "${varname:+X}" ] # to check variable is set and not empty

答案 1 :(得分:0)

首先,shell使用 COLUMNS ,因此您的示例以您不希望的方式关闭。最好使用安全变量名,所有大写字母通常都保留给shell变量。

现在已经不在了,测试操作员很简单:

  

-n如果STRING的长度非零,则STRING将返回true

     

-z如果STRING的长度为零,STRING将返回true

没有任何魔法或奇怪的事情发生,如果有任何事情只要确保在变量上始终使用双引号并确保使用安全名称。