
Eu tenho uma matriz:
ARRAY=(12.5 6.2)
Desejo retornar o valor máximo em ARRAY queA saída é 12,5
Alguém pode me compartilhar ideias?
Eu tentei isso:
max=0
for v in ${ARRAY[@]}; do
if (( $v > $max )); then max=$v; fi;
done
echo $max
Mas isso me devolveu:
((: 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 ")
Responder1
printf '%s\n' "${ARRAY[@]}" |
awk '$1 > m || NR == 1 { m = $1 } END { print m }'
Como o bash
shell não faz aritmética de ponto flutuante, é mais fácil comparar números de ponto flutuante em outro idioma. Aqui estou usando awk
para encontrar o máximo de todos os elementos do ARRAY
array.
O printf
comando produzirá cada elemento do array em sua própria linha e o awk
código atualizará seu m
valor para ser o máximo dos valores vistos até agora. Ao final, o m
valor é impresso.
O teste on NR == 1
será verdadeiro para a primeira linha lida pelo awk
programa e inicializará o valor de m
para o primeiro valor do array (algo que você não fez, o que significa que seu código teria retornado 0
para um array com todos os valores negativos números, se tivesse funcionado).
Responder2
Se você quiser fazer aritmética de ponto flutuante, precisará mudar para ksh93, zsh ou yash (ou fish
se estiver pronto para se afastar dos shells do tipo Bourne), bash
não os suporta.
Para uma sintaxe compatível com todos os 3 shells:
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[@]}"
(você precisa de uma versão recente de zsh
for inf
/ nan
para ser suportada. Variações no caso são suportadas em todos os 3 ( INF
, NaN
, Inf
...), mas yash
suporta apenas grafias alternativas como Infinity
; 0x12p34
tipos de números zsh
ainda não são suportados. Cuidado, pois se 010
significa 10 ou 8 depende do shell e de sua configuração)