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
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))
ilmancase
. - Siellä ' s ei
case
mukana tässä. - Ei, mutta käytit kirjaimellista
+
, joten tarvitsetcase
ulkopuolella käsittelemään vähennystä erikseen. - @manatwork: Sinä n eliminoi
case
OP ' -koodistaecho $(($num1$op$num2))
– se toimii , muttacase
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 ' sdouble
-tyyppi. Huomaa, että sinun ' ei tarvitse asettaascale
tähän. Lisäyksiä varten parametriascale
ei käytetä. Asteikko3.1415+9.99
johdetaan operandien asteikosta (tässä 4). - Kuinka tehdä matematiikka, jos yksi arvo on
450
ja toinen on desimaalimuisti muuttujaan$mynumber
? Esimerkiksi450-$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ä toimicomputedval=$(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 $
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