
Ich habe ein Array:
ARRAY=(12.5 6.2)
Ich möchte den Maximalwert in ARRAY zurückgeben, derDie Ausgabe beträgt 12,5
Kann mir jemand Ideen mitteilen?
Ich habe Folgendes versucht:
max=0
for v in ${ARRAY[@]}; do
if (( $v > $max )); then max=$v; fi;
done
echo $max
Aber es gibt mir zurück:
((: 12.5 > 0 : syntax error: invalid arithmetic operator (error token is ".5 > 0 ")
((: 6.2 > 0 : syntax error: invalid arithmetic operator (error token is ".2 > 0 ")
Antwort1
printf '%s\n' "${ARRAY[@]}" |
awk '$1 > m || NR == 1 { m = $1 } END { print m }'
Da die bash
Shell keine Gleitkommaarithmetik unterstützt, ist es einfacher, Gleitkommazahlen in einer anderen Sprache zu vergleichen. Hier verwende ich, awk
um das Maximum aller Elemente im ARRAY
Array zu finden.
Der printf
Befehl gibt jedes Element des Arrays in einer eigenen Zeile aus und der awk
Code aktualisiert seinen m
Wert auf den Höchstwert der bisher angezeigten Werte. Am Ende m
wird der Wert ausgedruckt.
Der Test NR == 1
ist für die erste vom awk
Programm gelesene Zeile wahr und initialisiert den Wert auf m
den ersten Wert des Arrays (was Sie nicht tun, was bedeutet, dass Ihr Code, 0
wenn es funktioniert hätte, ein Array mit ausschließlich negativen Zahlen zurückgegeben hätte).
Antwort2
Wenn Sie Gleitkommaarithmetik durchführen möchten, müssen Sie zu ksh93, zsh oder yash wechseln (oder fish
wenn Sie bereit sind, sich von Bourne-ähnlichen Shells zu verabschieden), bash
da diese nicht unterstützt werden.
Für eine zu allen 3 Shells kompatible Syntax:
max() {
[ "$#" -gt 0 ] || return
typeset i max="$1"; shift
for i do
if [ "$((i > max))" -ne 0 ]; then
max=$i
fi
done
printf '%s\n' "$max"
}
array=(12.5 6.2 nan 0xfff -inf inf -1e12 1e20)
max "${array[@]}"
(Sie benötigen eine aktuelle Version von zsh
/ inf
, nan
damit es unterstützt wird. Variationen in der Groß-/Kleinschreibung werden in allen 3 unterstützt ( INF
, NaN
, Inf
...), aber nur yash
alternative Schreibweisen wie Infinity
; 0x12p34
Zahlentypen werden von noch nicht unterstützt . Beachten Sie, dass es von der Shell und ihrer Konfiguration abhängt, zsh
ob 10 oder 8 bedeutet.)010