
我有一個陣列:
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
shell 不執行浮點運算,因此比較其他語言中的浮點數會更容易。在這裡,我用來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[@]}"
(您需要最新版本的zsh
for inf
/才能獲得支援。所有 3 個版本( , , ...)nan
都支援大小寫變體,但僅支援替代拼寫,例如;尚不支援數字類型。請注意,是否表示 10或8 取決於shell 及其配置)INF
NaN
Inf
yash
Infinity
0x12p34
zsh
010