Ich habe versucht, eine numerische Variable mit beiden var=$var+1
und var=($var+1)
ohne Erfolg zu erhöhen. Die Variable ist eine Zahl, obwohl Bash sie als Zeichenfolge zu lesen scheint.
Bash Version 4.2.45 (1) -Release (x86_64-pc-linux-gnu) unter Ubuntu 13.10.
((++var))
oder((var=var+1))
oder((var+=1))
.var=0; ((var++))
ein Fehlercode zurückgegeben, währendvar=0; ((var++)); ((var++))
dies nicht der Fall ist. Irgendeine Idee warum?help '(('
. In der letzten Zeile steht:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
@ gniourf_gniourfs Tipp dies beinhaltet,((++var))
aber nicht((var++))
.let var++
ohne Anführungszeichen sicher ?Arithmetik in Bash verwendet
$((...))
Syntax.quelle
((...))
der Schlüssel zur Verwendung von Arithmetik ist in bash. Mir war nicht klar, dass ich nur die akzeptierte Antwort betrachtete - ich dachte, es gäbe ein seltsames Regelwerk über die Reihenfolge der Operationen oder etwas, das zu allen Klammern in der akzeptierten Antwort führte.Performance-Analyse verschiedener Optionen
Dank der Antwort von Radu Rădeanu , die folgende Möglichkeiten bietet, eine Variable in bash zu erhöhen :
Es gibt auch andere Möglichkeiten. Schauen Sie sich zum Beispiel die anderen Antworten auf diese Frage an.
So viele Möglichkeiten zu haben, führt zu diesen beiden Fragen:
Inkrementeller Leistungstestcode:
Ergebnisse:
Fazit:
Es sieht so aus,
i+=1
als ob Bash bei der Ausführung am schnellsten ist, wenn$i
es als Ganzzahl deklariert wird.let
Aussagen scheinen besonders langsam zu sein undexpr
sind bei weitem die langsamsten, weil sie nicht eingebaut sind.quelle
Es gibt auch Folgendes:
Achten Sie auf die Leerzeichen und " ist nicht "
Radus Antworten und Kommentare sind zwar erschöpfend und sehr hilfreich, aber bashspezifisch. Ich weiß, dass Sie speziell nach bash gefragt haben, aber ich dachte, ich würde nachschauen, da ich diese Frage fand, als ich das gleiche mit sh in busybox unter uCLinux machen wollte. Dies ist tragbar jenseits von Bash.
quelle
i=$((i+1))
$(...)
in dieser Shell eine Prozessersetzung verfügbar ist, würde ich empfehlen, diese zu verwenden.Wenn Sie
$var
eine Ganzzahl deklarieren , funktioniert das, was Sie das erste Mal versucht haben:Referenz: Variablentypen, Bash-Anleitung für Anfänger
quelle
In allen Antworten fehlt eine Methode -
bc
bc
wird vom POSIX- Standard festgelegt und sollte daher auf allen Versionen von Ubuntu- und POSIX-kompatiblen Systemen vorhanden sein. Die<<<
Umleitung kann aus Gründen derecho "$VAR" | bc
Portabilität in geändert werden. Da jedoch die Frage lautet, istbash
es in Ordnung, sie nur zu verwenden<<<
.quelle
Der Rückgabecode
1
Problem vorhanden ist für alle Standardvarianten (let
,(())
usw.). Dies führt häufig zu Problemen, z. B. bei Skripten, die verwendet werdenset -o errexit
. Hier ist, was ich verwende, um Fehlercode1
aus mathematischen Ausdrücken zu verhindern , die ausgewertet werden0
.quelle
Dies muss der schlechteste Weg sein, um eine so einfache Aufgabe zu erledigen, aber ich wollte es nur zum Spaß dokumentieren (komplettes Gegenteil von Codegolf).
oder
Nehmen Sie ernsthaft eine der anderen viel besseren Möglichkeiten in Anspruch.
quelle