Суммировать все положительные целые числа в массиве bash

Чтобы сопоставить сочетания клавиш в Lubuntu / LXDE, вы можете отредактировать ~/.config/openbox/lxde-rc.xmlи перезапустите openbox через $ sudo openbox --reconfigureперезагрузить конфигурацию.

Или вы можете использовать lxhotkey, простую программу для настройки сочетаний клавиш.

2
06.05.2020, 11:59
4 ответа

Во-первых, вам нужно выбрать положительные числа, а не отрицательные

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

тогда вам нужно суммировать значения массива , а не индексы

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

или (, так как вы уже используете синтаксис арифметических вычислений ((... ))в другом месте)

sum=$((sum + arr[i]))
4
28.04.2021, 23:16

Вы можете использовать трюк, чтобы заменить все элементы массива, начиная с(#)на -, ничем.
Таким образом, вы можете пропустить проверку в цикле.

$ 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
28.04.2021, 23:16

Просто для удовольствия, вы также можете использовать 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
1
28.04.2021, 23:16

Это моя новая попытка:

# 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
2
28.04.2021, 23:16

Теги

Похожие вопросы