
配列があります:
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
には、 の最新バージョンが必要です。大文字と小文字の区別は 3 つすべてでサポートされています ( 、、...) が、のような代替スペルのみがサポートされています。数字の種類はまだ ではサポートされていません。 が 10 を意味するのか 8 を意味するのかは、シェルとその構成によって異なることに注意してください)inf
nan
INF
NaN
Inf
yash
Infinity
0x12p34
zsh
010