Ich möchte wissen, was genau der Unterschied ist
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Alle 4 ordnen die Variable a mit 2 zu, aber was ist der Unterschied?
Was ich bisher herausgefunden habe, ist, dass expr langsamer ist, weil es sich nicht um eine tatsächlich eingebaute Shell handelt. Aber nicht mehr als das.
((...))
tatsächlich kann für Aufgaben verwendet werdenbash
,ksh
undzsh
:n=10; ((n+=10)); echo $n
druckt 20 und((x=1)); echo $x
Drucke 1let
Befehl führt eine arithmetische Auswertung durch und ist eine eingebaute Shell.Führen Sie diesen Befehl aus und Sie erhalten nichts (nur auswertet):
$(( ))
wird verwendet, um eine arithmetische Erweiterung durchzuführen : Lesen Sie hierFühren Sie dieses aus und Sie werden eine Fehlermeldung erhalten (wegen der Erweiterung):
$[ ]
ist die alte Syntax für die arithmetische Erweiterung:expr
ist ein binärer Befehl, wenn Sie eine arithmetische Erweiterung innerhalb einer Befehlssubsituation durchführen möchten, können Sie ihn verwenden:quelle
Da in einigen der obigen Antworten ausdrücklich
ksh93
darauf hingewiesen wird, dass Gleitkomma-Berechnungen möglich sind, z.Sie können die Genauigkeit der Ausgabe mit printf steuern, z.
Mindestens ein Argument muss wie oben als Gleitkommazahl angegeben werden. Wenn beide als Ganzzahlen angegeben sind, wird nur eine Ganzzahlberechnung durchgeführt, z.
Dies kann hilfreich sein, wenn Sie Gleitkomma-Mathematik in einem Shell-Skript benötigen, da Sie den Aufruf eines externen Befehls vermeiden können.
quelle
zsh
Antwort gepostet habe . Daksh
undbash
einander (im Allgemeinen) ähnlicher sind als beideszsh
, scheint mir einekh93
Antwort auf diese Frage sehr nützlich zu sein.let
funktioniert nicht in cron Ich denke, das liegt anlet
seiner eigenen Umgebung. Verwenden Sie,$((...))
da es POSIX ist. Beispielsweise,in cron ergibt "x =", aber "x = 3", wenn von der Shell ausgeführt.
ergibt in allen Fällen "x = 3".
quelle