Скрипт оболочки — как вернуть максимальное значение в массиве?

Скрипт оболочки — как вернуть максимальное значение в массиве?

У меня есть массив:

ARRAY=(12.5 6.2)

Я хочу вернуть максимальное значение в ARRAY, котороеВыход 12,5

Кто-нибудь может поделиться со мной идеями?

Я попробовал это:

max=0
for v in ${ARRAY[@]}; do
    if (( $v > $max )); then max=$v; fi; 
done
echo $max

Но он возвращает мне:

((: 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 ")

решение1

printf '%s\n' "${ARRAY[@]}" |
awk '$1 > m || NR == 1 { m = $1 } END { print m }'

Поскольку bashоболочка не выполняет арифметику с плавающей точкой, проще сравнивать числа с плавающей точкой на другом языке. Здесь я использую awkдля поиска максимального значения всех элементов в ARRAYмассиве.

Команда printfвыведет каждый элемент массива на отдельной строке, а awkкод обновит его mзначение, чтобы оно стало максимальным из значений, которые были видны до сих пор. В конце значение mвыводится на печать.

Проверка on NR == 1будет истинной для первой строки, прочитанной программой, awkи инициализирует значение mпервым значением массива (чего вы не делаете, а это значит, что ваш код вернул бы 0массив со всеми отрицательными числами, если бы он сработал).

решение2

Если вы хотите выполнять арифметические операции с плавающей точкой, вам придется перейти на ksh93, zsh или yash (или fishесли вы готовы отказаться от оболочек типа Bourne), bashони не поддерживаются.

Для синтаксиса, совместимого со всеми тремя оболочками:

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[@]}"

(вам нужна последняя версия zshfor inf/ nanдля поддержки. Поддерживаются вариации в регистре во всех 3 случаях ( INF, NaN, ...), но поддерживаются Infтолько альтернативные варианты написания, такие как ; типы чисел пока не поддерживаются. Помните, что то, означает ли 10 или 8, зависит от оболочки и ее конфигурации)yashInfinity0x12p34zsh010

Связанный контент