können Sie verwenden arithmetic expansion:
$ val=1234567812345678
$ echo $((${val: -13:1} < 5 ? val - val % 10**13 : val - val % 10**13 + 10**13))
1230000000000000
$ echo $((${val: -12:1} < 5 ? val - val % 10**12 : val - val % 10**12 + 10**12))
1235000000000000
Diese prüft, ob die höchstwertigen entfernte Ziffer 5 oder größer ist, und wenn es ist, die letzte nicht entfernten Stelle wird um eins erhöht; dann subtrahieren wir den Divisionsrest von dem (potentiell modifizierten) Anfangswert.
Wenn Sie nicht haben wollen, es auf diese Weise zu schreiben, können Sie es in einer kleinen Funktion wickeln:
round() {
echo $((${1: -$2:1} < 5 ? $1 - $1 % 10**$2 : $1 - $1 % 10**$2 + 10**$2))
}
, die dann wie folgt verwendet werden kann:
$ round "$val" 13
1230000000000000
$ round "$val" 12
1235000000000000
Hinweis das Zitat $val
ist hier nicht unbedingt notwendig, es ist nur eine gute Angewohnheit.
Wenn die Einzeiler zu kryptisch ist, ist dies eine besser lesbare Version dieselbe ist:
round() {
local rounded=$(($1 - $1 % 10**$2)) # Truncate
# Check if most significant removed digit is >= 5
if ((${1: -$2:1} >= 5)); then
((rounded += 10**$2))
fi
echo $rounded
}
Neben arithmetischer Erweiterung, dies nutzt auch Parameter Expansion einen Teil zu erhalten: ${1: -$2:1}
steht für „nehmen $1
, zählen Sie $2
von der Rückseite, nehmen Sie ein Zeichen ". Es muss ein Leerzeichen vor -$2
sein (oder muss in Klammern angegeben werden), da es sonst als eine andere Erweiterung interpretiert würde und überprüft, ob $1
nicht gesetzt oder null ist, was wir nicht wollen.
Das sieht mehr wie Abschneiden als Rundung, und könnte mit Zeichensubstitutionen mit Regexes getan werden. – mpez0