2014-03-13 3 views
11

Als ich zuerst Shell Shell-Skripting gelernt, viele Beispiele sah ich let für grundlegende Arithmetik verwendet, aber später fand ich heraus, dass einige Umgebungen nicht let als eingebaut präsentieren , aber verwenden Sie stattdessen expr (obwohl es deutlich langsamer ist).Lassen Sie vs Ausdruck gegen Doppelklammer Arithmetik in Shell

Es ist jedoch auch möglich, in vielen Shells doppelte Klammern zur arithmetischen Ausführung zu verwenden, beispielsweise $((54 + 102)).

Da ich ein Skript für Portabilität schreibe, stellt dies ein Minenfeld von Möglichkeiten dar; Derzeit verwende ich zwei verschiedene Wrapper-Funktionen (eine für let und eine für expr) und mit einem schnellen Test zu entscheiden, welche im Rest meines Skripts zu verwenden.

Wie auch immer, ich möchte wissen, ob jemand die Kompatibilität jedes dieser drei arithmetischen Befehle (und aller anderen, die ich verpasst habe) erklären kann. Ich hoffe, dass die Doppelklammerform so weit verbreitet ist, dass ich Kompatibilitätsprüfungen einfach ablehnen kann, aber es ist schwer, danach zu suchen, also habe ich beschlossen, einfach hierher zu kommen und zu fragen, ob ich sicher bin.

Nur zu beachten Ich bin nur an regelmäßiger Arithmetik interessiert, ich denke, ich habe bereits die wenigen großen Zahlen behandelt, mit denen ich (möglicherweise) arbeiten muss.

+0

shell == bash? –

Antwort

6

$((...)) ist im POSIX-Standard definiert, der wahrscheinlich so portabel ist, wie Sie es benötigen.

+0

Hmm, in diesem Fall war es schon immer der POSIX-Standard, alle gängigen Shell-Umgebungen, die nicht POSIX-konform sind? Es erscheint seltsam, dass wir 'expr' hätten, wenn Doppelklammer praktisch alles tut, was sie tut, aber viel schneller. – Haravikk

+2

'expr' ist älter als der POSIX-Standard, und zwar aus einer Zeit, als die Shell nur die grundlegendsten Funktionen für die Implementierung externer Programme übrig ließ. Mir ist klar, dass Solaris die Bourne-Shell (die ursprüngliche 'sh', nicht die gleichnamige POSIX-Shell) als Standard-Systemshell verwendet, aber nicht als'/bin/sh' installiert ist und eine POSIX-Shell bei einigen noch verfügbar ist Pfadname – chepner