jak mohu přidat (odečíst atd.) dvě čísla s bash?

Dokážu číst čísla a operace pomocí:

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

, ale pak vše moje pokusy o přidání čísel selžou:

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

Spustit:

First number please 1 Second mumber please 2 Operation? + 

Výstup:

num1+num2 

… nebo …

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

… nebo. ..

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

Vypadá to, že se mi stále zobrazují řetězce, snad když zkusím přidat add („2 + 2“ místo „4“).

Komentáře

  • Upravil jsem váš nadpis, protože to je dobrá obecná otázka, a kdybyste zúžili kontext, uvědomili byste si, že to nemá nic společného case nebo cokoli kromě jednoho řádku: echo $num+$num, protože bude problém reprodukovat přesně . Myšlenka s minimalizací kontext v otázkách programování je vysvětlen zde: sscce.org
  • +1 Ahoj zlatovlásky, ano, to mi bylo jasné později, ale ano já celkem Souhlasíte s argumentací a ano, tím konkrétnější a ' singulární ' otázka je tím lepší. Vítám vaše úpravy 🙂 Děkuji 🙂

Odpověď

Aritmetika v skořápkách POSIX se provádí pomocí $ a dvojitých závorek (( )):

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

Z toho můžete přiřadit (sans echo):

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

Existuje také expr:

expr $num1 + $num2 

Ve skriptování $(()) je vhodnější, protože se vyhýbá rozvětvení / provedení příkazu expr.

Komentáře

  • Nebo dokonce přímo echo $(($num1$op$num2)) bez zapojení case.
  • Existuje ' s žádné case.
  • Ne, ale použili jste doslovný +, takže budete potřebovat case venku, aby bylo možné odečítání řešit samostatně.
  • @manatwork: n odstranit case z kódu OP ' s echo $(($num1$op$num2)) – to bude fungovat , ale použití case je robustnější, protože chyby můžete zpracovat pomocí výchozího *.
  • +1 k oba. Používal jsem případ (nemusí se to na začátku ukázat), ale jak jste si oba uvědomili, problém nebyl ' o případu.

Odpověď

Stávající odpověď je čistý bash, takže bude rychlejší, ale zvládne pouze celá čísla. Pokud potřebujete zvládnout plováky, musíte použít externí program bc.

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

scale=4 říká bc použít čtyři desetinná místa. Další informace najdete v man bc.

Komentáře

  • Pamatujte, že zatímco bash nepodporuje ' aritmetiku s plovoucí desetinnou čárkou s $((...)) mnoha skořápkami (ksh93, zsh, alespoň yash). Výhodou bc je, že podporuje libovolnou přesnost, zatímco aritmetika prostředí je omezena na procesor ' s double typ. Upozorňujeme, že ' zde není třeba nastavovat scale. U doplňků se parametr scale nepoužívá. Měřítko 3.1415+9.99 bude odvozeno od měřítka operandů (zde 4).
  • Jak udělat matematiku, pokud je jedna hodnota 450 a druhý je desítkově uložen v proměnné $mynumber? Například 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc by to měl udělat. Pokud chcete, aby se proměnná rozšířila, musíte použít uvozovky místo jednoduchých uvozovek.
  • @evilsoup, nyní to funguje jako kouzlo. Děkujeme.
  • computedval=$(echo 'scale=10;var1-var2' | bc) nefunguje ', nefunguje ani computedval=$(echo 'scale=10;$var1-$var2' | bc)

Odpověď

Můžete také použít strukturu $[ ... ]. V tomto případě používáme vestavěný mechanismus v Bash, jehož použití je rychlejší a o něco pohodlnější. Jelikož víme, že vše mezi $ [a] je považováno za výraz, nemusíme předcházet proměnné pomocí $. Podobně nepotřebujeme zabezpečovat * zacházet s ním jako se vzorem.

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

odpověď

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

Všimněte si \ před * (pro násobení), celý výraz musí být v rámci zpětných uvozovek `.

Komentáře

  • expr není nutné a ' nikdy je nutné zachytit standardní výstup příkazu, jen aby byl zapsán zpět na standardní výstup.

Odpověď

minimalistický

total=0 ((total+=qty)) 

odpověď

Na základě posloupnosti vstupů, které od uživatele požadujete , zdá se, že používáte obrácenou polskou notaci.

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

Možná bude lepší, když použijete přímo dc (stolní kalkulačka), protože k tomu slouží.

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

E xample session using dc:

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

Nebo neinteraktivně:

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *