Warum [[-n $ var]] anstelle von [[$ var]]?

7

In dieser Antwort hatte ich einen Code, der lautete:

if [[ $ZSH_VERSION ]]; then

Dies wurde bearbeitet , um zu sein:

if [[ -n $ZSH_VERSION ]]; then

Update: Ich habe gerade den Bearbeitungskommentar gesehen:

[[x]] hat bis vor kurzem in zsh nicht funktioniert

Ich sah durch die zshRelease Notes und nicht die Bezugnahme auf diese finden konnte.

Welche zshVersion zuerst erlaubt [[ x ]]?

Tom Hale
quelle

Antworten:

10

Aus den zsh5.5.1-Dokumenten fürCONDITIONAL EXPRESSIONS

Wenn es aus Kompatibilitätsgründen ein einzelnes Argument gibt, das nicht syntaktisch signifikant ist, normalerweise eine Variable, wird die Bedingung als Test dafür behandelt, ob der Ausdruck als Zeichenfolge ungleich Null erweitert wird. Mit anderen Worten, [[$ var]] ist dasselbe wie [[-n $ var]]. Es wird empfohlen, nach Möglichkeit das zweite explizite Formular zu verwenden.

Mit dem Quellbaum herum,

% 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...

Die Überprüfung von git logzeigt, dass die Codeänderung etwas früher als die Dokumentation erfolgte:

commit 9d47e8398d299e53ffe4e7ddf3731d2fedae9948
...
Date:   Tue May 13 08:16:50 2014 -0700

    32609: [[ $var ]] behaves as [[ -n $var ]] for bash/ksh compatibility

Die Zuordnung der ChangeLogDatei zu git tagist mir nicht klar, aber es scheint, dass zsh5.0.6 (Do 28. August 19:07:04 2014 +0100) die erste Version mit dieser Änderung ist.

Thrig
quelle
Siehe git tag --contains 9d47e8398d299e53ffe4e7ddf3731d2fedae9948für die Liste der Git-Tags, die das Commit enthalten. Das 32609ist ein Hinweis auf die Mailingliste: zsh.org/cgi-bin/mla/redirect?WORKERNUMBER=32609
Stéphane Chazelas
1

Es wird expliziter gezeigt, was der Code tut.

Persönlich würde ich in diesem Fall etwas bevorzugen, [[ -n $ZSH_VERSION ]]weil es zeigt, dass es auf Nicht-Leere des Wertes der var testet.

Aber ich habe oft vars, die für die boolesche Bedeutung in meinen Skripten gedacht sind, und ich benenne sie entsprechend, wie is_logged_inoder running_in_background. Wenn solche Variablen in meinen Skripten nicht gesetzt sind, sind sie es false. Und in solchen Fällen bevorzuge ich die Verwendung [[ running_in_background ]], nur weil dies ohne den -nTeil besser liest , wie ein normaler Satz:

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

Aber IMO ist es nur Geschmackssache und sollte als solche nicht bearbeitet werden: Es ist Ihr Code.

Hkoof
quelle
1
Nun, OP zitierte Code von einem anderen Autor und derselbe Autor kam dann herein und änderte ihn, so dass "Ihr Code" in diesem speziellen Fall "beide Codes" bedeutet. ;-) :-)
Fabby