Programowanie > Bash, skrypty powłoki

liczby zmiennoprzecinkowe i zmienne

(1/1)

jola138:
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.

Paweł Kraszewski:
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. (...)
--- Koniec cytatu ---

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.

1709:
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"
--- Koniec cytatu ---

1709:
Przyklad

--- Kod: ---
#!/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
--- Koniec kodu ---

Nawigacja

[0] Indeks wiadomości

Idź do wersji pełnej