쉘 스크립트 - 배열의 최대값을 반환하는 방법은 무엇입니까?

쉘 스크립트 - 배열의 최대값을 반환하는 방법은 무엇입니까?

배열이 있습니다.

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[@]}"

( 지원을 받으려면 zshfor / 의 최신 버전이 필요합니다 . 3개 버전( , , ...) 모두 대소문자 변형을 지원하지만 대체 철자만 지원합니다(예: 숫자 유형은 아직 지원되지 않습니다. 10이 의미되거나 8에 따라 다름). 쉘 및 해당 구성에서)infnanINFNaNInfyashInfinity0x12p34zsh010

관련 정보