Shell-Skript – Wie gibt man den Maximalwert im Array zurück?

Shell-Skript – Wie gibt man den Maximalwert im Array zurück?

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 bashShell keine Gleitkommaarithmetik unterstützt, ist es einfacher, Gleitkommazahlen in einer anderen Sprache zu vergleichen. Hier verwende ich, awkum das Maximum aller Elemente im ARRAYArray zu finden.

Der printfBefehl gibt jedes Element des Arrays in einer eigenen Zeile aus und der awkCode aktualisiert seinen mWert auf den Höchstwert der bisher angezeigten Werte. Am Ende mwird der Wert ausgedruckt.

Der Test NR == 1ist für die erste vom awkProgramm gelesene Zeile wahr und initialisiert den Wert auf mden ersten Wert des Arrays (was Sie nicht tun, was bedeutet, dass Ihr Code, 0wenn 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 fishwenn Sie bereit sind, sich von Bourne-ähnlichen Shells zu verabschieden), bashda 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, nandamit es unterstützt wird. Variationen in der Groß-/Kleinschreibung werden in allen 3 unterstützt ( INF, NaN, Inf...), aber nur yashalternative Schreibweisen wie Infinity; 0x12p34Zahlentypen werden von noch nicht unterstützt . Beachten Sie, dass es von der Shell und ihrer Konfiguration abhängt, zshob 10 oder 8 bedeutet.)010

verwandte Informationen