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
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łucase
. - 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życiecase
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
, przynajmniejyash
). Zaletąbc
jest to, że obsługuje on dowolną precyzję, podczas gdy arytmetyka powłoki jest ograniczona do procesora ' sdouble
typ. Pamiętaj, że nie ' nie musisz ustawiaćscale
tutaj. W przypadku dodatków parametrscale
nie jest używany. Skala3.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ład450-$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, anicomputedval=$(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 $
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