2016-06-23 9 views
5

Ich glaube, die beiden folgenden Codefragmente gültig sind in POSIX konform Schale:Sollte ich "Test" oder "[" "]" in der POSIX-Shell verwenden?

Option 1:

if [ "$var" = "dude" ] 
then 
    echo "Dude, your var equals dude." 
fi 

Option 2:

if test "$var" = "dude" 
then 
    echo "Dude, your var equals dude." 
fi 

Welche Syntax bevorzugt und Warum? Gibt es einen Grund, in bestimmten Situationen eine über der anderen zu verwenden?

+0

Ja, sie sind beide gültig. Nein, es gibt keinen besonderen Grund, einen zu bevorzugen - es ist eine stilistische Entscheidung. –

+0

'test' wird wahrscheinlich zu einer Prozessgabel führen und somit weniger effizient sein. –

+3

@WillemVanOnsem, auf einer Shell, wo 'test' nicht eingebaut ist, dann wird es auch ein externes'/usr/bin/['- suchen, Ihr Betriebssystem * liefert das als ein external binary (oft ein Hardlink zum gleichen Inode wie '/ usr/bin/test', der auf sein' argv [0] 'schaut, um zu sehen, wie es aufgerufen wurde und entscheiden, ob man ein nachstehendes'] 'von seinem Argument verwerfen soll Liste). –

Antwort

6

Es gibt keinen funktionalen Unterschied, was dies zu einer reinen Stilwahl ohne allgemein akzeptierte Richtlinien macht. The bash-hackers wiki hat einen erweiterten Abschnitt auf klassische (POSIX-konforme) test, mit viel Aufmerksamkeit auf Best Practices und Fallstricke, und nimmt keine Position, auf die zu bevorzugen.

Außerdem the POSIX specification for test - während es tut Marke viel Funktionalität obsolescent - gibt weder Form als über den anderen bevorzugt.

Das sagte, ein Vorteil zu test ist, dass es weniger förderlich ist, dass Leute Erwartungen in andere Sprachen bringen, die in gebrochenem oder fehlerhaftem Code resultieren. Zum Beispiel ist es ein häufiger Fehler zu schreiben [$foo=1] anstatt der richtigen [ "$foo" = 1 ], aber Leute sind nicht weit zu sehen test$foo=1 zu schreiben: Es ist optisch offensichtlich, dass test "$foo" = 1 die gleichen Parsing-Regeln wie andere Shell-Befehle folgt, und erfordert daher die gleiche Sorgfalt in Bezug auf Zitate und Leerzeichen.


[1] Wie -a, -o, ( und ), und jede Nutzung mit mehr als vier Argumenten (mit Ausnahme des Hinter ] auf einer Instanz gestartet unter dem Namen [).

+0

Die POSIX-Shell betrachtet "-a" oder "-o" nicht als veraltet. [** POSIX Programmer's Manual (Test) **] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128) Ich glaube, das Argument gegen ihre Verwendung ist * fehlende Clairity * nach Bash eingeführt '-a' (* true, wenn Datei existiert *). Der POSIX Test erwähnt jedoch nicht '&&' oder '||'. –

+2

@ DavidC.Rankin, ... wenn Sie auf '[OB XSI]' irgendwo in dieser Spezifikation klicken - zu der Sie verknüpft - es öffnet sich das folgende, das diese Codes erklärt (und damit, dass "OB" veraltet bedeutet): http://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html. Um von daher zu zitieren: "Die beschriebene Funktionalität kann in einer zukünftigen Version dieses POSIX.1-2008-Bandes entfernt werden. Streng angepasste POSIX-Anwendungen und streng konforme XSI-Anwendungen dürfen keine veralteten Funktionen verwenden." –

+0

@ DavidC.Rankin, ...und dafür gibt es gute Gründe: In den mehr als vier Argumentationsfällen mit "-a" und "-o" gibt es Mehrdeutigkeiten, bei denen das "x $ foo" -Idiom notwendig sein kann, um die Interpretation zwischen Werten zu disambiguieren und Testsyntax (besonders wenn diese Menge von Werten '(' oder ')') enthalten kann. –