Manchmal muss ich eine Zahl durch eine andere teilen. Es wäre großartig, wenn ich dafür einfach eine Bash-Funktion definieren könnte. Bisher bin ich gezwungen, Ausdrücke wie zu verwenden
echo 'scale=25;65320/670' | bc
Aber es wäre großartig, wenn ich eine .bashrc-Funktion definieren könnte, die so aussieht
divide () {
bc -d $1 / $2
}
command-line
function
arithmetic
bashrc
bc
ixtmixilix
quelle
quelle
ksh
, die 93-Variante, unterstützt Here-Strings.Bash kann bis zu einem gewissen Grad selbst rechnen. Es ist jedoch nicht nützlich für die Genauigkeit, da es rundet.
Aber Sie haben genau Recht - eine Bash-Funktion wäre eine einfache Abkürzung und Ihr Beispiel funktioniert im Grunde.
Werfen Sie das in Ihre .bashrc und dann können Sie:
quelle
echo $((10 / 5))
braucht kein Zitat.echo $((6383/7671))
Sie erhalten null. Sie müssen explizit über Gleitkommazahlen sein:echo $((6383.0/7671.0))
Sie kennen wahrscheinlich die Bash-Funktion "expr" wie in
Das ist auf ganze Zahlen beschränkt und benötigt die Leerzeichen zwischen den Argumenten.
Was hindert Sie daran, eine Funktion in Anlehnung an den Echoausdruck zu definieren, den Sie bereits verwenden? Dh
quelle
Keine wirkliche Antwort auf diese genaue Frage, aber es könnte gut sein, sie zu kennen. Benutze
zsh
;-)quelle
expr
Builtin nicht verwenden konnte, also trotzdem eine gute Antwort :)Wenn Sie
calc
auf Ihrem System installiert haben und das Runden nicht mögen, können Sie:quelle
apcalc
(Arbitary Precision) ... Die Binärdatei heißtcalc
calc
.Ein schmutziger Hack für kleine Werte und eine begrenzte Genauigkeit ohne Verwendung von bc wäre, den Nominator vor der Division zu multiplizieren, um ein genaues Ergebnis zu erhalten.
Beispiel ohne Genauigkeit:
und mit 2-stelliger Genauigkeit: Mit 100 multiplizieren und den Dezimalpunkt 2 Schritte nach links verschieben:
Dies ist nur sinnvoll, wenn der Zahlenbereich bereits bekannt ist und die Genauigkeit immer gleich ist. Zu vermeiden, bc anzurufen , und sed anzurufen , scheint nicht sehr vernünftig zu sein.
Beachten Sie, dass das Multiplizieren der Werte zu Überlauffehlern führen kann, jedoch nicht sehr früh:
quelle
$[expression]
stattdessenThe old format $[expression] is deprecated and will be removed in upcoming versions of bash.
Anstelle von bc können Sie auch awk verwenden:
quelle
quelle