배열이 있습니다.
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개 버전( , , ...) 모두 대소문자 변형을 지원하지만 대체 철자만 지원합니다(예: 숫자 유형은 아직 지원되지 않습니다. 10이 의미되거나 8에 따라 다름). 쉘 및 해당 구성에서)inf
nan
INF
NaN
Inf
yash
Infinity
0x12p34
zsh
010