如何对 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