
У меня есть массив:
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[@]}"
(вам нужна последняя версия zsh
for inf
/ nan
для поддержки. Поддерживаются вариации в регистре во всех 3 случаях ( INF
, NaN
, ...), но поддерживаются Inf
только альтернативные варианты написания, такие как ; типы чисел пока не поддерживаются. Помните, что то, означает ли 10 или 8, зависит от оболочки и ее конфигурации)yash
Infinity
0x12p34
zsh
010