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.