
배열이 있습니다.
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
지원하지 않습니다.
세 가지 쉘 모두와 호환되는 구문의 경우:
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