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

関連情報