我正在学习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!
为什么
test
with avar_assigned_with_emptystring
总是给出正确的结果,无论它是 with-n
还是-z
option?test
包围的命令和单个条件表达式有什么区别[[]]
?""
和 和有什么区别var_assigned_with_emptystring
?我认为该参数应该被扩展(或评估)为""
与测试函数内部处理时相同的值。但test -n $var_assigned_with_emptystring
给出了不同的返回状态test -n ""
答案1
这主要涵盖在为什么不带引号的空格参数扩展在双括号“[[”内有效,但在单括号“[”内无效?。简而言之,[[ … ]]
是具有不同解析规则的特殊语法,而test
和[
是普通命令。
在普通格式sh
(包括ksh
、bash
等)中,由于缺少双引号,因此test -n $var
对 的值应用拆分和通配符。var
这不会发生在双括号内。
不同zsh
的是,zsh
大多数情况下不需要在变量扩展周围使用双引号。但是,列表上下文(例如命令行)之间$var
和列表上下文中存在一个区别"$var"
:如果单词为空且不包含任何引号,zsh
则将其删除。因此,当 的值为var
空时,是带有一个参数的test -n $var
命令,并且带有一个非空参数的命令是“true”。 But是带有两个参数和一个空字符串的命令,它将测试应用于空字符串,即“false”。test
-n
test
test -n "$var"
test
-n
-n
在 内部[[ … ]]
,不会发生空字删除,因此[[ -n $var ]]
和[[ -n "$var" ]]
是等价的。