答案1
来自zsh
5.5.1 文档CONDITIONAL EXPRESSIONS
为了兼容性,如果有一个在语法上不重要的参数(通常是变量),则该条件将被视为测试表达式是否扩展为非零长度的字符串。换句话说,[[ $var ]] 与 [[ -n $var ]] 相同。建议尽可能使用第二种明确的形式。
有了源树,
% grep -rl 'if there is a single argument' .
./Doc/Zsh/cond.yo
% git blame ./Doc/Zsh/cond.yo | grep 'if there is a single argument'
d082827c83 (Jun T 2014-05-18 22:03:35 +0900 198) For compat...
检查git log
显示代码更改比文档更早进行:
commit 9d47e8398d299e53ffe4e7ddf3731d2fedae9948
...
Date: Tue May 13 08:16:50 2014 -0700
32609: [[ $var ]] behaves as [[ -n $var ]] for bash/ksh compatibility
我不清楚该ChangeLog
文件的映射,但5.0.6 (Thu Aug 28 19:07:04 2014 +0100) 似乎是第一个进行此更改的版本。git tag
zsh
答案2
它更明确地显示代码正在做什么。
就我个人而言,在这种情况下我稍微更喜欢,[[ -n $ZSH_VERSION ]]
因为它表明它正在测试 var 值的非空性。
但我经常在我的脚本中使用表示布尔值的变量,并相应地命名它们,例如is_logged_in
或running_in_background
。如果这些变量在我的脚本中未设置,则它们是false
。在这种情况下,我更喜欢使用[[ running_in_background ]]
,只是因为没有这一-n
部分读起来更好,就像一个正常的句子:
if [[ running_in_background ]] ; then
echo "something" | logger -t myprog
fi
但在我看来,这只是品味问题,因此不应该被编辑:它是你的代码。