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