bash ile iki sayıyı nasıl ekleyebilirim (çıkarma, vb.)?


90

Rakamları ve işlemi şu şekilde okuyabilirim:

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

ama sonra tüm numaraları ekleme girişimlerim başarısız oldu:

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

Çalıştırmak:

First number please
1
Second mumber please
2
Operation?
+

Çıktı:

num1+num2

...veya...

echo $num1+$num2;;

# results in: 1+2    

...veya...

echo `$num1`+`$num2`;;

# results in: ...line 9: 1: command not found

Görünen o ki hala ekleme eklemek istediğimde hala stringler alıyorum ("4" yerine "2 + 2").


5
Başlığınızı değiştirdim, çünkü bu iyi bir genel soru ve bağlamı daralttıysanız, bunun casebir satır dışında yapabileceği bir şey olmadığını fark ettiniz : echo $num+$numçünkü bu problemi tam olarak tekrarlayacaktır . Programlama sorularındaki bağlamı en aza indirme fikri burada açıklanmıştır: sscce.org
goldilocks

2
+1 Merhaba goldilocks, evet o zamandan sonra bana netleşti, ama evet, akıl yürütme şeklinize tamamen katılıyorum ve evet, daha belirgin ve 'tekil' bir soru daha iyidir. Düzenlemelerinize hoş geldiniz :) :) Teşekkürler :)
Michael Durrant

Yanıtlar:


116

POSIX mermilerindeki aritmetik$ ve çift parantez ile yapılır (( )):

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

Bundan (sans echo) atayabilirsiniz :

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

Ayrıca expr:

expr $num1 + $num2

Kodda komut $(())için bir çatal / çalıştırmayı engellediği için tercih edilir expr.


Hatta doğrudan dahil echo $(($num1$op$num2))olmadan doğrudan case.
Manatwork

Hiçbir Orada var caseburada içeriyordu.
goldilocks

1
Hayır, ama kelimenin tam anlamıyla kullandınız +, bu yüzden caseçıkarma işlemini ayrı ayrı yapabilmek için dışarıya ihtiyacınız olacak .
Manatwork

1
@manatwork: caseOP'nin kodundan kurtulmayı kastediyorsunuz echo $(($num1$op$num2))- işe yarayacak, ancak casevarsayılan olarak hataları işleyebildiğiniz için kullanımı daha sağlamdır *.
goldilocks

İkinize de +1. Davayı kullanıyordum (başlangıçta göstermemiş olabilir), ancak ikinizin de farkına vardığınız gibi, sorun durumla ilgili değildi.
Michael Durrant,

13

Var olan cevap saf bash, yani bundan daha hızlı olacak, ama sadece tamsayılarla başa çıkabilir. Yüzenleri kullanmanız gerekiyorsa, harici programı kullanmanız gerekir bc.

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

scale=4Söyler bcdört ondalık basamak kullanmak. Daha man bcfazla bilgi için bkz .


Bu süre Not bashile nokta Arithmetics yüzen desteklemez $((...)), birçok kabukları ( ksh93, zsh, yashen azından) yap. Bunun avantajı, bckeyfi ariteliği desteklerken kabuk aritmetik işlemcinin doubletipi ile sınırlıdır . scaleBurada ayarlamanız gerekmediğini unutmayın . İlaveler için, scaleparametre kullanılmaz. Ölçeği 3.1415+9.99operandlarınkilerden türetilecektir (burada 4).
Stéphane Chazelas

Bir değer 450ve diğeri değişkende saklanan ondalık ise matematik nasıl yapılır $mynumber? Örneğin 450-$mynumber,.
Sigur

@sigur echo "450-$mynumber" | bcyapmalı. Genişletmek için bir değişken istiyorsanız, tek tırnak yerine çift tırnak kullanmak zorunda.
Evilsoup

@ evilsoup, şimdi bir cazibe gibi çalışıyor. Teşekkürler.
Sigur

computedval=$(echo 'scale=10;var1-var2' | bc)çalışmıyor, ne de çalışmıyorcomputedval=$(echo 'scale=10;$var1-$var2' | bc)
StatsSorceress

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

Not \önce *(çoğalması için), bütün ekspresyon backquotes `içinde olmak zorundadır.


1
exprgerekli değildir ve bir komutun standart çıktısını sadece standart çıktısına geri yazmak için asla gerekli değildir.
chepner


1

$[ ... ]Yapısını da kullanabilirsiniz . Bu durumda, Bash'de yerleşik mekanizmayı kullanıyoruz; bu da daha hızlı ve kullanımı daha kolay. $ [, Ve] arasındaki her şeyin bir ifade olarak değerlendirildiğini bildiğimizden, değişkenlerden önce gelmemize gerek yoktur $. Benzer şekilde, *ona bir kalıp gibi davranmaktan da korunmamıza gerek yoktur.

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

0

Kullanıcıdan talep ettiğiniz girişlerin sırasına bağlı olarak, ters cila yazımı kullandığınız anlaşılıyor .

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

dcDoğrudan (masa hesap makinesini) kullanmak için daha iyisini yapabilirsiniz , çünkü bunun için.

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

Örnek oturumu kullanarak dc:

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

Veya etkileşimli olmayan bir şekilde:

$ dc -e '1 2 + p'
3
$
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.