シェル スクリプト - 配列内の最大値を返す方法は?

シェル スクリプト - 配列内の最大値を返す方法は?

配列があります:

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 に切り替える必要があります (または、fishBourne のようなシェルから離れる準備ができている場合)。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 を意味するのかは、シェルとその構成によって異なることに注意してください)infnanINFNaNInfyashInfinity0x12p34zsh010

関連情報