Bash 배열의 모든 양의 정수를 합산하십시오.

Bash 배열의 모든 양의 정수를 합산하십시오.

Bash 배열의 모든 양의 정수를 합산하는 방법.

이것은 내 코드입니다.

#!/bin/bash

arr=(2 43 -1 -33 24 12 -6)

for (( i = 0; i < ${#arr[@]}; ++i )); do
  if (( arr[i] > 0 )); then
    sum=`expr $sum + $i`
  fi
done
echo "$sum"

답변1

먼저, 음수가 아닌 양수를 선택해야 합니다.

if (( arr[i] > 0 )); then

그런 다음 배열을 합산해야합니다가치인덱스 대신

sum=`expr $sum + ${arr[i]}`

또는 (이미 (( ... ))다른 곳에서 산술 평가 구문을 사용하고 있기 때문에)

sum=$((sum + arr[i]))

답변2

#( )로 시작하는 모든 배열 요소를 아무것도 없는 것으로 바꾸는 트릭을 사용할 수 있습니다 -.
이렇게 하면 루프에서 검사를 건너뛸 수 있습니다.

$ arr=( 2 43 -1 -33 24 12 -6 )
$ echo "${arr[@]/#-*}"
2 43   24 12

수정된 스크립트는 다음과 같습니다.

#!/bin/bash

arr=( 2 43 -1 -33 24 12 -6 )

sum=0
for i in "${arr[@]/#-*}"; do
  (( sum+=i ))
done

echo "$sum"

답변3

이것은 나의 새로운 시도입니다.

# 2+43+24+12=81
sum=0
arr=( 2 43 -1 -33 24 12 -6 )
arr=("${arr[@]/-*/0}")
sum=$(IFS=+; echo "$(( ${arr[*]} ))" )

echo "$sum"
81

답변4

awk재미로 루프에 사용할 수도 있습니다 .

arr=(2 43 -1 -33 24 12 -6); 
sum=$(echo ${arr[*]} | awk '
    BEGIN{RS=" "}
    $0>0{sum+=$0}
    END{print sum}');
echo $sum
81

정수 수학 이상의 작업을 수행하려는 경우에 유용합니다.

arr=(2 43 -1 -33 24 12 -6); 
sqrt=$(echo ${arr[*]} | awk '
    BEGIN{RS=" "}
    $0>0{sum+=$0}
    END{printf "%.2f", sum^0.5}');
echo $sqrt
9.00

관련 정보