为什么 [[ -n $var ]] 而不是 [[ $var ]]?

为什么 [[ -n $var ]] 而不是 [[ $var ]]?

这个答案我有一些代码如下:

if [[ $ZSH_VERSION ]]; then

已编辑成为:

if [[ -n $ZSH_VERSION ]]; then

更新:我刚刚看到编辑评论:

[[ x ]] 直到最近才在 zsh 中工作

我浏览了zsh发行说明并且找不到对此的参考。

哪个zsh版本首先允许[[ x ]]

答案1

来自zsh5.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 tagzsh

答案2

它更明确地显示代码正在做什么。

就我个人而言,在这种情况下我稍微更喜欢,[[ -n $ZSH_VERSION ]]因为它表明它正在测试 var 值的非空性。

但我经常在我的脚本中使用表示布尔值的变量,并相应地命名它们,例如is_logged_inrunning_in_background。如果这些变量在我的脚本中未设置,则它们是false。在这种情况下,我更喜欢使用[[ running_in_background ]],只是因为没有这一-n部分读起来更好,就像一个正常的句子:

if [[ running_in_background ]] ; then
    echo "something" | logger -t myprog
fi

但在我看来,这只是品味问题,因此不应该被编辑:它是你的代码。

相关内容