我有一个数组:
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