对 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

相关内容