
配列があります。
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
他の言語の浮動小数点数を比較する方が簡単です。ここでは、awk
配列内のすべての要素の最大値を見つけるために使用していますARRAY
。
このprintf
コマンドは配列の各要素を独自の行に出力し、awk
コードはその値をm
これまでに示された最大値に更新します。最後にm
値を印刷します。
プログラムが読み取った最初の行のテストNR == 1
はtrueで、awk
値をm
配列の最初の値に初期化します。 (これは失敗しました。つまり、コードは0
すべての負の配列を返すので効果的です)。
答え2
浮動小数点演算を実行するには、サポートされていないksh93、zsh、またはyashに切り替える必要があります(またはfish
Bourneなどのシェルから離れる準備ができている場合)。bash
3つのシェルすべてと互換性のある構文の場合:
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 /の最新バージョンが必要です。3つのバージョン(、、、...)はすべて大文字と小文字のバリエーションをサポートしていますが、代替スペルのみをサポートしています(数値型はまだサポートされていません。 8に依存します)。inf
nan
INF
NaN
Inf
yash
Infinity
0x12p34
zsh
010