Forum Linux.pl

Programowanie => Bash, skrypty powłoki => Wątek zaczęty przez: jola138 w 2020-11-15, 23:47:51

Tytuł: liczby zmiennoprzecinkowe i zmienne
Wiadomość wysłana przez: jola138 w 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.
Tytuł: Odp: liczby zmiennoprzecinkowe i zmienne
Wiadomość wysłana przez: Paweł Kraszewski w 2020-11-16, 07:17:03
Instrukcja obsługi bash (https://linux.die.net/man/1/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.
Tytuł: Odp: liczby zmiennoprzecinkowe i zmienne
Wiadomość wysłana przez: 1709 w 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"
Tytuł: Odp: liczby zmiennoprzecinkowe i zmienne
Wiadomość wysłana przez: 1709 w 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