Shell脚本-如何返回数组中的最大值?

Shell脚本-如何返回数组中的最大值?

我有一个数组:

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 }'

由于bashshell 不执行浮点运算,因此比较其他语言中的浮点数会更容易。在这里,我用来awk查找数组中所有元素的最大值ARRAY

printf命令将在其自己的行上输出数组的每个元素,并且awk代码将其值更新m为迄今为止看到的最大值。最后,m打印该值。

程序读取的第一行的测试NR == 1将为 true,awk并将 的值初始化m为数组的第一个值(您未能执行此操作,这意味着您的代码将返回0一个全部为负数的数组数字,它是否有效)。

答案2

如果你想做浮点运算,你需要切换到 ksh93、zsh 或 yash(或者fish如果你准备好远离类似 Bourne 的 shell),bash不支持它们。

对于与所有 3 个 shell 兼容的语法:

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/才能得到支持。所有 3 个版本( , , ...)nan都支持大小写变体,但仅支持替代拼写,例如;尚不支持数字类型。请注意,是否表示 10或 8 取决于 shell 及其配置)INFNaNInfyashInfinity0x12p34zsh010

相关内容