测试命令和 [[]] 包围的单个条件表达式有什么区别?

测试命令和 [[]] 包围的单个条件表达式有什么区别?

我正在学习zsh的条件表达式部分,我发现一些不合理的输出。

例如:

$ mkdir emptyspace && cd emptyspace
$ var_assigned_with_emptystring=""

$ [[ -n $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a nonzero-len string!'
$ [[ -n "" ]] && echo '"" is a nonzero-len string!'

$ test -n $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a nonzero-len string by test!'
var_assigned_with_emptystring is a nonzero-len string by test!
$ test -n "" && echo '"" is a nonzero-len string by test!' 

----------


$ [[ -z $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a zero-len string!'
var_assigned_with_emptystring is not an empty string!
$ [[ -z "" ]] && echo '"" is a zero-len string!'
"" is a zero-len string!

$ test -z $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a zero-len string by test!'
var_assigned_with_emptystring is a zero-len string by test!
$ test -z "" && echo '"" is a zero-len string by test!'
"" is a zero-len string by test!

  1. 为什么testwith avar_assigned_with_emptystring总是给出正确的结果,无论它是 with-n还是-zoption?test包围的命令和单个条件表达式有什么区别[[]]

  2. ""和 和有什么区别var_assigned_with_emptystring?我认为该参数应该被扩展(或评估)为""与测试函数内部处理时相同的值。但test -n $var_assigned_with_emptystring给出了不同的返回状态test -n ""

答案1

这主要涵盖在为什么不带引号的空格参数扩展在双括号“[[”内有效,但在单括号“[”内无效?。简而言之,[[ … ]]是具有不同解析规则的特殊语法,而test[是普通命令。

在普通格式sh(包括kshbash等)中,由于缺少双引号,因此test -n $var对 的值应用拆分和通配符。var这不会发生在双括号内。

不同zsh的是,zsh大多数情况下不需要在变量扩展周围使用双引号。但是,列表上下文(例如命令行)之间$var和列表上下文中存在一个区别"$var":如果单词为空且不包含任何引号,zsh则将其删除。因此,当 的值为var空时,是带有一个参数的test -n $var命令,并且带有一个非空参数的命令是“true”。 But是带有两个参数和一个空字符串的命令,它将测试应用于空字符串,即“false”。test-ntesttest -n "$var"test-n-n

在 内部[[ … ]],不会发生空字删除,因此[[ -n $var ]][[ -n "$var" ]]是等价的。

相关内容