我正在阅读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 ]
会返回错误吗?
答案 0 :(得分:2)
使用单[
测试变量时,必须在双引号之间进行扩展,以防止分词。
由于[[
是shell关键字,bash可以处理变量扩展而无需双引号。
-n和-z需要第二个参数,该参数可以为null(空),但因为变量周围缺少双引号,所以在分词后没有参数。
比较以下两个命令
[ -n ] && echo ok # or [ -n $varname ]
[ -n "" ] && echo ok # or [ -n "$varname" ]
实施例
[ '' ] # false
[ '-z *6548*-' ] # true
实施例
[ "arg1" "arg2" ] # arg1: unary operator expected
[ -z '' ] # true
实施例
[ "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
没有任何魔法或奇怪的事情发生,如果有任何事情只要确保在变量上始终使用双引号并确保使用安全名称。