なぜ[[$var]]の代わりに[[-n $var]]を使うのですか?

なぜ[[$var]]の代わりに[[-n $var]]を使うのですか?

存在するこの回答次のコードがあります。

if [[ $ZSH_VERSION ]]; then

これ編集済みになる:

if [[ -n $ZSH_VERSION ]]; then

修正する:今編集者のコメントを見ました。

[[ x ]]は最近までzshでは動作しませんでした。

私は探しましたzshリリースノートそしてこれへの参照が見つかりません。

どのzshバージョンが最初に許可されましたか[[ x ]]

答え1

zsh5.5.1文書からCONDITIONAL EXPRESSIONS

互換性のために構文上重要でない引数(通常は変数)がある場合、条件は式が長さがゼロ以外の文字列に拡張されているかどうかをテストすることで処理されます。つまり、[[$ var]]は[[-n $ var]]と同じです。可能であれば、2番目の明示的な形式を使用することをお勧めします。

ソースツリーを利用すると、

% 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値のnullを許可するかどうかをテストしていることを示すため、少し好みです。

しかし、私はしばしばスクリプトでブール値を表す変数を使用し、それに応じて名前を付けis_logged_inますrunning_in_background。これらの変数が私のスクリプトに設定されていない場合false。この場合は、通常の文のように、この部分がない場合はよりよく読むので、使用することを[[ running_in_background ]]好みます。-n

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

しかし、私の考えではこれはただの好みの問題なので、編集してはいけません。あなたのパスワード。

関連情報