jak mogę dodać (odjąć itp.) dwie liczby za pomocą basha?

Potrafię odczytać liczby i wykonać następujące czynności:

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

ale potem wszystko moje próby dodania liczb nie powiodły się:

case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac 

Uruchom:

First number please 1 Second mumber please 2 Operation? + 

Wynik:

num1+num2 

… lub …

echo $num1+$num2;; # results in: 1+2 

… lub. ..

echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found 

Wygląda na to, że nadal otrzymuję ciągi znaków, gdy próbuję dodać add („2 + 2” zamiast „4”).

Komentarze

  • Zmieniłem twój tytuł, ponieważ jest to dobre ogólne pytanie i gdybyś zawęził kontekst, zdałbyś sobie sprawę, że nie ma to nic wspólnego z case lub cokolwiek z wyjątkiem jednej linii: echo $num+$num, ponieważ to odtworzy problem dokładnie . Pomysł z minimalizacją kontekst w pytaniach programistycznych jest wyjaśniony tutaj: sscce.org
  • +1 Cześć złotowłosa, tak, to stało się dla mnie później jasne, ale tak, totall y zgadzasz się z twoim rozumowaniem i tak, im bardziej szczegółowe i ' pojedyncze ' pytanie, tym lepiej. Witam Twoje zmiany 🙂 Dziękuję 🙂

Odpowiedź

Arytmetyka w powłokach POSIX jest wykonywana za pomocą $ i podwójnych nawiasów (( )):

echo "$(($num1+$num2))" 

Z tego możesz przypisać (sans echo):

num1="$(($num1+$num2))" 

Istnieje również expr:

expr $num1 + $num2 

W skryptach $(()) jest preferowany, ponieważ pozwala uniknąć rozwidlenia / wykonania polecenia expr.

Komentarze

  • Lub nawet bezpośrednio echo $(($num1$op$num2)) bez udziału case.
  • Istnieją ' nie ma tu case.
  • Nie, ale użyłeś literału +, więc będziesz potrzebować case na zewnątrz, aby osobno zająć się odejmowaniem.
  • @manatwork: You mea n wyeliminuj case z kodu PO ' za pomocą echo $(($num1$op$num2)) – to zadziała , ale użycie case jest bardziej niezawodne, ponieważ możesz obsługiwać błędy z domyślnym *.
  • +1 do obydwoje z was. Używałem przypadku (być może nie pokazałem go na początku), ale ponieważ oboje zdaliście sobie sprawę, że problem nie dotyczył ' sprawy.

Odpowiedź

Istniejąca odpowiedź to czysty bash, więc będzie szybsza niż ta, ale obsługuje tylko liczby całkowite. Jeśli chcesz obsługiwać liczby zmiennoprzecinkowe, musisz użyć zewnętrznego programu bc.

$ echo "scale=4;3.1415+9.99" | bc 13.1315 

scale=4 mówi bc, aby użył czterech miejsc po przecinku. Aby uzyskać więcej informacji, zobacz man bc.

Komentarze

  • Pamiętaj, że bash nie ' nie obsługuje arytmetyki zmiennoprzecinkowej z $((...)), wieloma powłokami (ksh93, zsh, przynajmniej yash). Zaletą bc jest to, że obsługuje on dowolną precyzję, podczas gdy arytmetyka powłoki jest ograniczona do procesora ' s double typ. Pamiętaj, że nie ' nie musisz ustawiać scale tutaj. W przypadku dodatków parametr scale nie jest używany. Skala 3.1415+9.99 zostanie wyprowadzona ze skali operandów (tutaj 4).
  • Jak wykonać obliczenia, jeśli jedną wartością jest 450, a druga jest dziesiętna przechowywana w zmiennej $mynumber? Na przykład 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc powinno to zrobić. Jeśli chcesz, aby zmienna się rozwijała, musisz użyć podwójnych cudzysłowów zamiast pojedynczych cudzysłowów.
  • @evilsoup, teraz działa jak urok. Dzięki.
  • computedval=$(echo 'scale=10;var1-var2' | bc) nie ' nie działa, ani computedval=$(echo 'scale=10;$var1-$var2' | bc)

Odpowiedź

Możesz także użyć struktury $[ ... ]. W tym przypadku korzystamy z mechanizmu wbudowanego w Bash, który jest szybszy i nieco wygodniejszy w użyciu. Ponieważ wiemy, że wszystko między $ [a] jest traktowane jako wyrażenie, nie musimy poprzedzać zmiennych ciągiem $. Podobnie nie musimy zabezpieczać * przed traktowaniem go jak wzorca.

num1=2 num2=3 echo $[num1 + num2] 5 

Odpowiedź

echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b` 

Zwróć uwagę na \ przed * (do mnożenia), całe wyrażenie musi znajdować się wewnątrz cudzysłowów odwrotnych `.

Komentarze

  • expr nie są konieczne i ' nigdy konieczne do przechwycenia standardowego wyjścia polecenia, aby zapisać je z powrotem na standardowe wyjście.

Odpowiedz

minimalist

total=0 ((total+=qty)) 

Odpowiedź

Na podstawie sekwencji danych wejściowych, o które prosisz użytkownika , wygląda na to, że używasz odwróconej notacji polskiej.

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

Może lepiej będzie po prostu użyć bezpośrednio dc (kalkulatora biurkowego), ponieważ do tego służy.

DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic. 

E x przykładowa sesja z użyciem dc:

$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $ 

Lub nieinteraktywnie:

$ dc -e "1 2 + p" 3 $ 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *