Shell script - Como retornar o valor máximo no array?

Shell script - Como retornar o valor máximo no array?

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 bashshell não faz aritmética de ponto flutuante, é mais fácil comparar números de ponto flutuante em outro idioma. Aqui estou usando awkpara encontrar o máximo de todos os elementos do ARRAYarray.

O printfcomando produzirá cada elemento do array em sua própria linha e o awkcódigo atualizará seu mvalor para ser o máximo dos valores vistos até agora. Ao final, o mvalor é impresso.

O teste on NR == 1será verdadeiro para a primeira linha lida pelo awkprograma e inicializará o valor de mpara o primeiro valor do array (algo que você não fez, o que significa que seu código teria retornado 0para 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 fishse estiver pronto para se afastar dos shells do tipo Bourne), bashnã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 zshfor inf/ nanpara ser suportada. Variações no caso são suportadas em todos os 3 ( INF, NaN, Inf...), mas yashsuporta apenas grafias alternativas como Infinity; 0x12p34tipos de números zshainda não são suportados. Cuidado, pois se 010significa 10 ou 8 depende do shell e de sua configuração)

informação relacionada