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

相關內容