2010-03-10 28 views
23

Ich habe gerade auf der Bash Syntax gestolpert:

foo=42 
bar=$[foo+1] # evaluates an arithmetic expression 

Wenn ich für diese googeln, fand ich http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05 :

3.4.6. Arithmetische Erweiterung

Die arithmetische Erweiterung ermöglicht die Auswertung eines arithmetischen Ausdrucks und die Ersetzung des Ergebnisses. Das Format für arithmetische Erweiterung ist:

$((EXPRESSION)) 

...

Wo immer möglich, Bash-Benutzer sollten versuchen, die Syntax mit eckigen Klammern zu verwenden:

$[ EXPRESSION ] 

Allerdings wird dies die einzige berechnen Ergebnis des Ausdrucks, und Sie keine Tests ...

In meiner bash man-Seite finde ich nur die $((EXPRESSION)) bilden, wie:

foo=42 
bar=$((foo+1)) # evaluates an arithmetic expression 

Also, was Tests nicht mit $[...] ausgeführt werden, die mit $((...)) tun, oder ist die $[...] nur eine Legacy-Version von $((...))?

+1

Eine historische Perspektive finden Sie unter http://stackoverflow.com/a/40048865/2908724. – bishop

Antwort

29

Die Manpage für bash v3.2.48 sagt:

[...] Das Format für arithmetische Erweiterung ist:

 $((expression)) 

Das alte Format $ [Ausdruck] veraltet und wird in den kommenden Versionen bash entfernt werden.

Also $[...] ist alte Syntax, die nicht mehr verwendet werden sollte.

+5

Beachten Sie, dass der genaue Text nicht in der * bash Man Page enthalten ist (http://tis.edu/php/chet/bash/bash.html), sondern in * einigen * bash Man Pages (zB [Debian patch this] (http://patch-tracker.debian.org/patch/series/view/bash/4.1-3/man-arithmetic.dpatch)). Die Funktion ist seit bash-2.0 veraltet, wird aber heute beibehalten (bash-4.2). –

9

@sth ist völlig richtig. Und falls Sie neugierig sind, warum jetzt eine ausführlichere Syntax verwendet wird, sehen Sie sich diese alte E-Mail von der Mailingliste an.

http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html

„Zu Beginn des Jahres Vorschläge wurde verwendet, um eine Form $ [Ausdruck]. Es war funktional gleichbedeutend mit dem "$ (())" des aktuellen Textes, aber Einwände waren hinterlegt, dass die 1988 KornShell bereits implementiert hatte "$ (())" und gab es keinen zwingenden Grund, noch eine andere Syntax zu erfinden . Darüber hinaus ist die „$ []“ Syntax hatte eine geringe Unverträglichkeit die Muster bei Aussagen beteiligt sind.“

Ich bin nicht sicher, dass ich die Gründe mögen‚ aber jemand hat dies bereits mehr verbosely getan‘, aber es Sie haben es - vielleicht war das Problem mit der Falschaussage überzeugender, als ich mir aus dieser obskuren Erwähnung vorstelle?