Nowe posty

xx Jak poprawić polecenie wyszukujące największe pliki? (2)
Dzisiaj o 01:48:08
xx CUPS - Wyłączenie hostname w nazwie udostępnionej drukarki (6)
Wczoraj o 02:45:06
xx Tłumaczenie prostych programów napisanych w csh na sh (0)
2021-06-11, 16:07:52
xx Do regulaminu (0)
2021-06-07, 02:16:34
xx kompletny restore systemu (5)
2021-06-03, 11:47:08
xx Połączenie wifi, nie skanuje w poszukiwaniu sieci. (1)
2021-06-02, 22:04:54
xx problemy z instalacją (1)
2021-06-02, 14:23:26
xx Pomoc w napisaniu skryptu (11)
2021-05-31, 13:34:19
xx Instalacja php5.4 na Debian10 (2)
2021-05-31, 09:13:54
xx Wielkie firmy wymuszają dane (7)
2021-05-30, 20:25:21

Autor Wątek: liczby zmiennoprzecinkowe i zmienne  (Przeczytany 564 razy)

Offline jola138

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 2
    • Zobacz profil
liczby zmiennoprzecinkowe i zmienne
« dnia: 2020-11-15, 23:47:51 »
Hej,
Dopiero zaczynam przygodę z linuxem i natrafiłem na następujący problem:
Piszę jakiś skrypt i chciałbym wiedzieć jak można zapisać liczbę zmiennoprzecinkową, podaną przez argument, w zmiennej.
Może przedstawię to za pomocą kodu:
--------------------------------------------
#!/bin/bash

funkcja() {

    let var1=$1+$2
    let var2=$1-$2

    if [ $var2 -ne 0 ]
    then
        echo "scale=2;$var1/$var2" | bc
    else
        echo Nie mozna dzielic przez 0
        exit -1
    fi
}

funckja $1 $2

---------------------------------------------

I w konsoli mogę wpisać np.
./nazwasryptu.sh 6 18

Niestety problem występuję jak chciałbym przekazać liczby zmiennoprzecinkowe np.
./nazwaskrytpu.sh 4.23 5.25

Jak mogę poradzić sobie z takim problemem?
Czy jeśli już uda mi się wpisać do var1 liczbę zmiennoprzecinkową, to warunek if będzie działał? Jeśli nie to jak mogę rozwiązać ten problem?

Z góry dziękuję za wszelką pomoc.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2717
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
    • keybase.io/pkraszewski
Odp: liczby zmiennoprzecinkowe i zmienne
« Odpowiedź #1 dnia: 2020-11-16, 07:17:03 »
Instrukcja obsługi bash, rozdział Arithmetic Evaluation:

Cytuj
(...) Evaluation is done in fixed-width integers with no check for overflow, though division by 0 is trapped and flagged as an error. (...)

Po ludzku: bash (jak i wszystkie inne powłoki, które znam) potrafi pracować tylko na liczbach całkowitch.

Wszelka pomoc: użyj innego języka skryptowego.
Paweł Kraszewski
~Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2464
  • 1709
    • Zobacz profil
Odp: liczby zmiennoprzecinkowe i zmienne
« Odpowiedź #2 dnia: 2020-11-17, 21:04:46 »
Mozna użyć w tym wspomnianego wyżej bc zamiast let
Ale trzeba dodać warumek przy VAR2 że gdy liczba mniejsza od 0, to ma dodać zamiast odjąć
lub może istnieje inny sposób zapisu.
ponieważ przy  $1-(-1) otrzymasz.
Cytuj
"(standard_in) 1: syntax error"
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2464
  • 1709
    • Zobacz profil
Odp: liczby zmiennoprzecinkowe i zmienne
« Odpowiedź #3 dnia: 2020-11-18, 16:06:13 »
Przyklad
#!/bin/bash


FUNKCJA() {
    VAR1=$(echo "scale=2;$1+($2)" | bc)
    VAR2=$(echo "scale=2;$1-($2)" | bc)

    echo "Debug: VAR1 = $VAR1"
    echo "Debug: VAR2 = $VAR2"

    if [[ $(echo "$VAR2 > 0" | bc) -eq 1 ]]
    then
        echo "scale=2;($VAR1)/($VAR2)" | bc
    else
        echo Nie mozna dzielic przez 0
        exit -1
    fi
}

FUNKCJA $1 $2
« Ostatnia zmiana: 2020-11-18, 16:09:59 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.