Der Versuch, eine Bash-Arithmetik für ein Skript durchzuführen, wird jedoch $e
erst am Ende aktualisiert. Die Ausgabe spricht für sich.
max=5
for e in $(seq 1 1 $max); do
percent=$(( $e/$max*100 ))
echo "echo $e / $max : = $percent"
done
Tl; DR: Zeigt 1..5 als Prozentsatz an.
Ausgabe :
echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100
Warum ist das?
command-line
bash
scripts
Cybex
quelle
quelle
Antworten:
bash
kann keine Nicht-Ganzzahl-Arithmetik verarbeiten. Es gibt Ihnen das richtige Ergebnis, solange alle Ausdrücke Ganzzahlen sind. Sie müssen also vermeiden, dass Ihre Berechnung irgendwo einen nicht ganzzahligen Wert enthält.In Ihrem Fall, wenn Sie auswerten
1 / 5
,2 / 5
usw. schafft es die ganze Zahl Null - Werte in bash correspondings auf einige nicht-ganzzahlige Werte und die Ergebnisse kommen aus Null entsprechend zu sein. Der Vorrang von Division und Multiplikation ist derselbe und derselbe Vorrang von Operatoren wird immer von links nach rechts ausgeführt, wenn sie in den Ausdruck eingefügt werden.Eine Möglichkeit besteht darin, zuerst die Multiplikation und dann die Division durchzuführen, damit bash nie mit nicht ganzzahligen Werten umgehen muss. Der korrigierte Ausdruck lautet:
quelle
1/5
keinen nicht ganzzahligen Wert. Es wird der ganzzahlige Wert erstellt0
, da das Ergebnis der ganzzahligen Division von 1 durch 5 0 ist. Weitere Operationen verwenden den Wert von erfolgreich0
. Dies ist nicht das, was das OP beabsichtigt hat, aber keine Operation erzeugt einen nicht ganzzahligen Wert und keine Operation schlägt fehl.Bash kann diese Art von Arithmetik nicht besonders gut ... Hier ist Ihr Problem:
Wenn Sie nicht ganzzahlige Werte verarbeiten müssen, können Sie verwenden
bc
(Dank an @Arronical für den Hinweis, wie die Ausgabe als Ganzzahl formatiert wird)
quelle
.0
die Ausgabe abschneiden, indem Sie ändern$percent
${percent%.*}
Im Gegensatz zu bash bietet awk eine Fließkomma-Arithmetik. Beispielsweise:
quelle
Versuchen
:)
Siehe Abschnitt ARITHMETISCHE BEWERTUNG von:
Es werden nur Ganzzahlen unterstützt.
quelle