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
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řebovatcase
venku, aby bylo možné odečítání řešit samostatně. - @manatwork: n odstranit
case
z kódu OP ' secho $(($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ýhodoubc
je, že podporuje libovolnou přesnost, zatímco aritmetika prostředí je omezena na procesor ' sdouble
typ. Upozorňujeme, že ' zde není třeba nastavovatscale
. U doplňků se parametrscale
nepoužívá. Měřítko3.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říklad450-$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 anicomputedval=$(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 $
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