miten voin lisätä (vähentää jne.) kaksi numeroa bashilla?

Voin lukea numerot ja operaation:

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

mutta sitten kaikki yritykseni lisätä numeroita epäonnistuvat:

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

Suorita:

First number please 1 Second mumber please 2 Operation? + 

Tulos:

num1+num2 

… tai …

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

… tai. ..

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

Näyttää siltä, että saan merkkijonoja vielä ehkä, kun yritän lisätä add (”2 + 2” eikä ”4”).

Kommentit

  • Muokkasin otsikkoa, koska tämä on hyvä yleinen kysymys, ja jos kaventaisit kontekstia alas, olisit huomannut, että tällä ei ole mitään tekemistä case tai mikä tahansa muu kuin yksi rivi: echo $num+$num, koska tämä toistaa ongelman tarkalleen . Idea minimoimalla ohjelmointikysymysten konteksti selitetään täällä: sscce.org
  • +1 Hei kultalukot, kyllä, se tuli minulle selväksi jälkeenpäin, mutta kyllä minä koko y samaa mieltä perustelustanne ja kyllä, tarkempi ja ' yksikkö ' on parempi kysymys. Olen tyytyväinen muokkauksiisi 🙂 Kiitos 🙂

Vastaa

POSIX-kuorien aritmeetti tehdään $ – ja kaksoissulkeilla (( )):

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

Voit määrittää siitä (sans echo):

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

Mukana on myös expr:

expr $num1 + $num2 

Komentosarjoissa $(()) on suositeltava, koska se välttää haarukan / suorituksen komennolle expr.

Kommentit

  • Tai jopa suoraan echo $(($num1$op$num2)) ilman case.
  • Siellä ' s ei case mukana tässä.
  • Ei, mutta käytit kirjaimellista +, joten tarvitset case ulkopuolella käsittelemään vähennystä erikseen.
  • @manatwork: Sinä n eliminoi case OP ' -koodista echo $(($num1$op$num2)) – se toimii , mutta case on vakaampi, koska voit käsitellä virheitä oletusarvoisella *.
  • +1 molemmat teistä. Käytin tapausta (ei ehkä ole osoittanut sitä alussa), mutta kun molemmat huomasit, ongelma ei ollut ' t tapauksesta.

Vastaus

Nykyinen vastaus on puhdas bash, joten se on nopeampi kuin tämä, mutta se pystyy käsittelemään vain kokonaislukuja. Jos haluat käsitellä kellukkeita, sinun on käytettävä ulkoista ohjelmaa bc.

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

scale=4 kehottaa bc käyttämään neljää desimaalia. Katso lisätietoja kohdasta man bc.

Kommentit

  • Huomaa, että kun bash ei tue ' ei tue kelluvaa aritmeettisuutta $((...)): llä, monilla kuorilla (ksh93, zsh, yash ainakin). bc: n etuna on, että se tukee mielivaltaista tarkkuutta, kun taas kuoren aritmeettisuus on rajoitettu prosessoriin ' s double -tyyppi. Huomaa, että sinun ' ei tarvitse asettaa scale tähän. Lisäyksiä varten parametria scale ei käytetä. Asteikko 3.1415+9.99 johdetaan operandien asteikosta (tässä 4).
  • Kuinka tehdä matematiikka, jos yksi arvo on 450 ja toinen on desimaalimuisti muuttujaan $mynumber? Esimerkiksi 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc pitäisi tehdä se. Jos haluat muuttujan laajentuvan, sinun on käytettävä kaksoislainauksia yksittäisten lainausten sijaan.
  • @evilsoup, nyt se toimii kuin viehätys. Kiitos.
  • computedval=$(echo 'scale=10;var1-var2' | bc) ei toimi ' eikä toimi computedval=$(echo 'scale=10;$var1-$var2' | bc)

Vastaa

Voit käyttää myös rakennetta $[ ... ]. Tässä tapauksessa käytämme Bashissa sisäänrakennettua mekanismia, joka on nopeampi ja hieman kätevämpi käyttää. Koska tiedämme, että kaikkea välillä $ [, ja] käsitellään lausekkeena, meidän ei tarvitse edetä muuttujia merkillä $. Samoin meidän ei tarvitse suojata * käsittelemästä sitä mallina.

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

vastaus

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

Huomaa \ ennen * (kertolasku), koko lausekkeen on oltava backoteissa ”.

Kommentit

  • expr ei ole tarpeen, ja se ' ei koskaan on tarpeen kaapata komennon vakiolähtö vain sen kirjoittamiseksi takaisin vakiotulostukseen.

Vastaa

minimalistinen

total=0 ((total+=qty)) 

vastaus

Perustuu käyttäjältä pyytämiesi syötteiden sarjaan , näyttää siltä, että käytät käänteisen puolan merkintää.

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

Voit tehdä paremmin, jos käytät suoraan dc (työpöydän laskin) -palvelua, koska se on sitä varten.

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

E xample-istunto käyttämällä dc:

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

Tai ei-vuorovaikutteisesti:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *