Nowe posty

xx Problem z Linux Lite po instalacji (1)
Dzisiaj o 15:19:31
xx Dystrybucja pod HP Omen (7)
Dzisiaj o 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Sumowanie wartosci w zmiennej  (Przeczytany 3704 razy)

JanOlbracht

  • Gość
Sumowanie wartosci w zmiennej
« dnia: 2016-02-07, 18:35:01 »
Cześć,

mam pewien problem z sumowaniem wartosci w zmiennej, przykladowo mam ZMIENNA, echo ZMIENNA zwraca 1234 123 23 345 w kolejnych wierszach. Czy da sie w jakis prosty sposob zsumowac wszystkie te wartosci?

Sa one chyba widziane jako jeden string i w tym najwiekszy problem.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2763
  • 1709
    • Zobacz profil
Odp: Sumowanie wartosci w zmiennej
« Odpowiedź #1 dnia: 2016-02-07, 20:55:24 »
Przypuszczam ze twoje zmienne nie sa zmiennymi,
dopiero jak przypiszesz je do jakiejs litery bedzie to zmienna, np.
X=$(jakies dzialanie)
echo "wynik dzialania to $X"
Takze wynik zostal zapisany do zmiennej,
chociaz raczej do zmiennej zostal przypisany jakis wynik.
Zmienne mozesz wykorzystac do operacji matematycznych. Oczywiscie dane tez mozna zapisac do pliku i wykonac operacje np. na liniach, ale to juz zalezy od twojego pomyslu i checi co i jak zrobisz.
PS: wez poczytaj poradniki jak sie wykonuje operacje matemaczyczne, czy arytmetyczne, to nie jest trudne.
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

JanOlbracht

  • Gość
Odp: Sumowanie wartosci w zmiennej
« Odpowiedź #2 dnia: 2016-02-07, 21:36:21 »
Tak, to mialo byc echo $ZMIENNA.
 
Znam podstawy dzialan matematycznych, polecenie let i expr, ale tutaj mam konkretny problem, ktorego nie potrafie rozwiazac przy pomocy tych polecen.

Powtorze raz jeszcze, echo $ZMIENNA wyrzuca kilka liczb oddzielnych spacja/nowym wierszem, to bez znaczenia. Chce zsumowac te liczby, zawsze mozna meczyc fora i dodawac do nowej zmiennej sume, ale liczylem na jakies prostsze rozwiazanie.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2763
  • 1709
    • Zobacz profil
Odp: Sumowanie wartosci w zmiennej
« Odpowiedź #3 dnia: 2016-02-08, 00:03:06 »
Cytuj
Chce zsumowac te liczby, zawsze mozna meczyc pętle for i dodawac do nowej zmiennej sume
PS: Staraj się pisać jak najbardziej zrozumiale.

Może oto Ci chodziło,
x="234 564 89 9 908 0"

echo "x= $x"

y=$(echo $x | sed 's/ /+/g')

echo "y= $y"

z=$(($y))

echo "z= $z"

Wynik w terminalu to
$ ./t4
x= 234 564 89 9 908 0
y= 234+564+89+9+908+0
z= 1804
Poza tym że to ładnie wygląda to nie wydaje mi się to proste.
Mnie to z=$(($y)) przypomina funkcje zliczającą, a sed przypomina pentelkę,
ale nie koniecznie ją robi, może poprostu sprawdza kazdy znak aż się string nie zakończy.

Nawiasy wzięłem z tego tutoriala, zobacz rozdział   WYRAŻENIA ARYTMETYCZNE
http://mars.iti.pk.edu.pl/~anka/SO/bash+tcsh.pdf

Edytowane:
 Możesz oczywiście skrócić do y, ale to już twoja kwestia jak tam wolisz.
y=$(($(echo $x | sed 's/ /+/g')))
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Sumowanie wartosci w zmiennej
« Odpowiedź #4 dnia: 2016-02-08, 07:47:56 »
Można też tak:
#!/bin/bash

sumrek() {
        # Jeżeli nie ma co najmniej jednego argumentu - błąd
        [ "$1" ] || exit 255

        # Gdy jest 2 lub więcej argumentóœ
        if [ $# -ge 2 ]
        then
                # Pierwszy argument to dotychczasowa suma
                SUMT=$1

                # Drugi argument to kolejna liczba do dodania
                GLOWA=$2

                # Obcinamy wczytane 2 elementy ($@ zawiera od trzeciego do końca)
                shift 2

                # Dodajemy
                SUM=$[$SUMT + $GLOWA]

                # I wolamy rekurencyjnie z ogonem
                sumrek $SUM $@
        else
                # Została tylko suma - zwróć ją
                echo $1
        fi
}


sumiter() {
        # Jeżeli nie ma co najmniej jednego argumentu - błąd
        [ "$1" ] || exit 255

        # Wyciągnij pierwszy element
        SUM=$1
        shift

        # Powtarzaj, póki są jeszcze argumenty
        while [ "$1" ]
        do
                # Dosumuj kolejny argument
                SUM=$[ $SUM + $1 ]

                # I usuń go
                shift
        done
        echo $SUM
}


ZMIENNA="1234 123 23 345"

SUMA=`sumrek $ZMIENNA`
echo "Dodane liczby rekurencją: $SUMA"

SUMA=`sumiter $ZMIENNA`
echo "Dodane liczby iteracją: $SUMA"

Tylko nie wiem, jak głęboką rekurencję obsługuje BASH.
« Ostatnia zmiana: 2016-02-08, 07:54:38 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

xavery

  • Gość
Odp: Sumowanie wartosci w zmiennej
« Odpowiedź #5 dnia: 2016-03-10, 21:23:56 »
Jako zwolennik prostych i eleganckich rozwiązań zaproponuję:

$ x='1234 123 23 345'
$ expr ${x// / + }
1725

Oczywiście jeśli wzorzec podziału leksykalnego jest inny należy go odpowiednio uwzględnić.