GNU/Linux >> Znalost Linux >  >> Linux

Vysvětlení matematických operací Bash (aritmetika Bash).

Úvod

Matematické a aritmetické operace jsou ve skriptování Bash zásadní. Různé automatizační úlohy vyžadují základní aritmetické operace, jako je převod teploty CPU na Fahrenheity. Implementace matematických operací v Bash je jednoduchá a velmi snadné se ji naučit.

Tato příručka vás naučí, jak různými způsoby provádět základní matematiku v Bash.

Předpoklady

  • Přístup k příkazovému řádku/terminálu.
  • Textový editor pro příklady kódu, jako je nano nebo Vi/Vim.
  • Základní znalost skriptování v Bash.

Proč potřebujete matematiku ve skriptování Bash?

Ačkoli matematika není primárním účelem skriptování v Bash, znalost, jak provádět základní výpočty, je užitečná pro různé případy použití.

Mezi běžné případy použití patří:

  • Sčítání/odečítání/násobení/dělení čísel.
  • Zaokrouhlování čísel.
  • Zvyšování a snižování čísel.
  • Převod jednotek.
  • Výpočty s plovoucí desetinnou čárkou.
  • Zjištění procent.
  • Práce s různými číselnými základy (binární, osmičkové nebo šestnáctkové).

V závislosti na automatizační úloze pomůže základní matematika a aritmetika ve skriptování Bash provést rychlý výpočet, který přináší okamžité výsledky v požadovaném formátu.

Příkazy a metody Bash Math

Některé příkazy Linuxu umožňují okamžité provádění základních a pokročilých výpočtů. Tato část ukazuje základní matematické příklady s každou metodou.

Aritmetické rozšíření

Nejvhodnějším způsobem, jak dělat matematiku v Bash, je použití aritmetické expanze shellu. Vestavěná funkce vyhodnocuje matematické výrazy a vrací výsledek. Syntaxe aritmetických rozšíření je:

$((expression))

Syntaxe se skládá z:

  • Složený zápis (()) který vyhodnocuje výraz.
  • Proměnný operátor $ uložit výsledek.

Například přidejte dvě čísla a opakujte výsledek:

echo $((2+3))

Aritmetický rozšiřující zápis je preferovanou metodou při práci s Bash skripty. Zápis se často zobrazuje společně s if příkazy a cykly for v Bash.

příkaz awk

Příkaz awk funguje jako selektor pro výrazy vzoru. Chcete-li například provést přidání pomocí awk použijte následující příklad příkazu:

awk 'BEGIN { x = 2; y = 3; print "x + y = "(x+y) }'

Pro proměnné x = 2 a y = 3 , výstup vypíše x + y = 5 do konzole.

příkaz bc

bc příkaz (zkratka pro b asic c alculator) je nástroj příkazového řádku, který vykresluje jazyk bc. Program běží jako interaktivní program nebo používá standardní vstup k provádění libovolné přesné aritmetiky.

Propojte rovnici ze standardního vstupu do příkazu a načtěte výsledky. Například:

echo "2+3" | bc

Výstup vytiskne výsledek výpočtu.

Příkaz dc

dc příkaz (zkratka pro d esk c alculator) je nástroj pro kalkulačku, který podporuje obrácenou polskou notaci. Program používá standardní vstup a podporuje neomezenou přesnost aritmetiky.

Chcete-li získat výsledek, vložte do příkazu standardní vstupní rovnici. Například:

echo "2 3 + p" | dc

p v rovnici odešle tiskový signál do dc příkaz.

deklarujte příkaz

Příkaz Bash deklarovat umožňuje celočíselné výpočty. Chcete-li použít declare pro výpočty přidejte -i volba. Například:

declare -i x=2 y=3 z=x+y

Chcete-li zobrazit výsledky, opakujte každou proměnnou:

echo $x + $y = $z

Výstup vytiskne každou proměnnou do konzole.

příkaz expr

expr command je starší nástroj příkazového řádku pro vyhodnocení aritmetiky celých čísel. Příklad expr příkaz vypadá následovně:

expr 2 + 3

Čísla a znak operace oddělte mezerami a spusťte příkaz, abyste viděli výsledek výpočtu.

příkaz faktoru

factor command je nástroj příkazového řádku, který vytiskne faktory pro jakékoli kladné celé číslo a výsledek rozloží na prvočísla.

Chcete-li například vytisknout faktory čísla 100, spusťte:

factor 100

Výstup vytiskne rozložené číslo.

nechte příkaz

Příkaz Bash let provádí různé aritmetické, bitové a logické operace. Vestavěný příkaz funguje pouze s celými čísly. Následující příklad ukazuje let syntaxe příkazu:

let x=2+3 | echo $x

Výstup vytiskne výsledky.

testovací příkaz

test příkaz v Linuxu vyhodnocuje podmíněné výrazy a často se spáruje s příkazem Bash if. Existují dvě varianty syntaxe testu:

test 2 -gt 3; echo $?

Nebo alternativně:

[ 2 -gt 3 ]; echo $?

test příkaz vyhodnotí, zda je dvě větší než (-gt ) tři. Pokud je výraz pravdivý, výstup je nula (0 ), nebo jeden (1 ), pokud je nepravda.

Aritmetické operátory Bash

Bash nabízí širokou škálu aritmetických operátorů pro různé výpočty a vyhodnocení. Operátoři pracují s let , declare a aritmetické rozšíření.

Níže je rychlá referenční tabulka, která popisuje aritmetické operátory Bash a jejich funkčnost.

Syntaxe Popis
++x , x++ Před a po zvýšení.
--x , x-- Před a po snížení.
+ , - , * , / Sčítání, odčítání, násobení, dělení.
% , ** (nebo ^ ) Modulo (zbytek) a umocňování.
&& , || , ! Logické AND, OR a negace.
& , | , ^ , ~ Bitové AND, OR, XOR a negace.
<= , < , > , => Menší než nebo rovno, menší než, větší než a větší než nebo rovno operátorům porovnání.
== , != Operátory porovnání rovnosti a nerovnosti.
= Operátor přiřazení. Kombinuje se s dalšími aritmetickými operátory.

Jak dělat matematiku v Bash

Bash nabízí různé způsoby provádění matematických výpočtů v závislosti na typu problému.

Níže jsou uvedeny příklady některých běžných problémů, které jako řešení využívají matematické funkce nebo příkazy Bash. Většina příkladů používá Bash aritmetický expanzní zápis. Sekce také popisuje běžné matematické chyby Bash a jak je vyřešit.

Matematika s celými čísly

Při práci s celými čísly se nejsnáze používá a manipuluje s aritmetickým rozšířením zápisu. Vytvořte například výraz s proměnnými a okamžitě vypočítejte výsledek:

echo $((x=2, y=3, x+y))

Chcete-li vyhodnotit více výrazů, použijte složený zápis, uložte každý výpočet do proměnné a výsledek opakujte. Například:

((x=2, y=3, a=x+y, b=x*y, c=x**y)); echo $a, $b, $c

Při pokusu o rozdělení mějte na paměti následující:

1. Dělení nulou (0) je nemožné a vyvolá chybu.

2. Bashova aritmetická expanze nepodporuje aritmetiku s plovoucí desetinnou čárkou. Při pokusu o dělení v tomto případě výstup ukazuje nulu (0).

Výsledkem celočíselného dělení musí být celé číslo.

Zvyšování a snižování

Bashova aritmetická expanze používá inkrementaci a dekrementaci celého čísla ve stylu C. Operátor pro inkrementaci nebo dekrementaci je buď před nebo za proměnnou, což vede k odlišnému chování.

Pokud je operátor před proměnnou (++x nebo --x ), ke zvýšení nebo snížení dojde před přiřazením hodnoty. Chcete-li zjistit, jak funguje předběžné zvýšení, spusťte následující řádky:

number=1
echo $((++number))

Proměnná se zvýší a nová hodnota je okamžitě k dispozici.

Pokud je operátor za proměnnou (x++ nebo x-- ), ke zvýšení nebo snížení dojde po přiřazení hodnoty. Chcete-li vidět, jak funguje post-inkrementace, spusťte následující:

number=1
echo $((number++))
echo $number

Proměnná zůstane stejná a při následujícím použití se zvýší.

Aritmetika s plovoucí desetinnou čárkou

Přestože aritmetická expanze Bash nepodporuje aritmetiku s plovoucí desetinnou čárkou, existují i ​​jiné způsoby, jak takové výpočty provádět. Níže jsou uvedeny čtyři příklady použití příkazů nebo programovacích jazyků dostupných na většině systémů Linux.

1. Pomocí awk až na 6 desetinných míst:

awk 'BEGIN { x = 2.3; y = 3.2; print "x * y = "(x * y) }'

2. Pomocí bc pomocí -l příznak až na 20 desetinných míst:

echo "2.3 * 3.2" | bc -l

3. Použití Perlu až na 20 desetinných míst:

perl -e 'print 2.3*3.2'

Perl je v systémech Linux často předinstalovaný.

4. Pomocí printf a aritmetického rozšíření převeďte zlomek na desetinné číslo:

printf %.<precision>f "$((10**<multiplier> * <fraction>))e-<multiplier>"

Přesnost určuje počet desetinných míst, zatímco násobitel je mocninou deseti. Číslo by mělo být nižší než násobitel. Jinak vzorec vloží do výsledku koncové nuly.

Například převeďte 1/3 na desetinné číslo s přesností dvě:

printf %.2f "$((10**3 * 1/3))e-3"

Vyhněte se této metodě pro přesné výpočty a používejte ji pouze pro malý počet desetinných míst.

Výpočet procenta a zaokrouhlení

Níže jsou uvedeny dva způsoby výpočtu procenta v Bash.

1. Použijte printf s aritmetickým rozšířením.

printf %.2f "$((10**4 * part/total))e-4"%

Vypočítejte například, kolik procent 40 je ze 71:

printf %.2f%% "$((10**4 * 40/71))e-4"%

Přesnost je omezena na dvě desetinná místa a odpověď se vždy zaokrouhluje dolů.

2. Použijte awk pomocí printf pro lepší přesnost:

awk 'BEGIN { printf "%.2f%%", (part/total*100) }'

Vypočítejte například, kolik procent je 40 ze 71 pomocí:

awk 'BEGIN { printf "%.2f%%", (40/71*100) }'

Odpověď se zaokrouhlí nahoru, pokud je třetí desetinné místo vyšší než pět, což poskytuje lepší přesnost.

Nalezení faktoriálu ve skořápce

Chcete-li vypočítat faktoriál pro libovolné číslo, použijte rekurzivní funkci Bash.

Pro malá čísla funguje Bashova aritmetická expanze dobře:

factorial () { 
    if (($1 > 1))
    then
        echo $(( $( factorial $(($1 - 1)) ) * $1 ))
    else

        echo 1
        return
    fi
}

Chcete-li zkontrolovat faktoriál pro číslo, použijte následující syntaxi:

factorial 5

Metoda je pomalá a má omezenou přesnost (až faktoriál 20).

Pro vyšší přesnost, rychlejší výsledky a větší čísla použijte bc příkaz. Například:

echo 'define factorial(x) {if (x>1){return x*factorial(x-1)};return 1}
 factorial(<number>)' | bc

Nahraďte <number> s faktoriálem k výpočtu. Chcete-li například najít faktoriál 50, použijte:

echo 'define factorial(x) {if (x>1){return x*factorial(x-1)};return 1} factorial(50)' | bc

Výstup vytiskne výsledek výpočtu do terminálu.

Vytvoření funkce Bash Calculator

Vytvořte jednoduchou funkci Bash kalkulačky s následujícím kódem:

calculate() { printf "%s\n" "[email protected]" | bc -l; }

Funkce převezme vstup uživatele a převede rovnici do bc příkaz.

Alternativně, abyste se vyhnuli používání programů, použijte aritmetické rozšíření Bash ve funkci:

calculate() { echo $(("[email protected]")); }

Mějte na paměti aritmetická expanzní omezení. Aritmetika s plovoucí desetinnou čárkou není u této funkce dostupná.

Uložte funkci do .bashrc aby byla funkce vždy dostupná v shellu.

Použití různých aritmetických základů

Ve výchozím nastavení používá Bashova aritmetická expanze základní deset čísel. Chcete-li změnit číselný základ, použijte následující formát:

base#number

Kde základna je libovolné celé číslo mezi dvěma a 64.

Chcete-li například provést binární (základ 2) výpočet, použijte:

echo $((2#1010+2#1010))

Osmičkové (základ 8) výpočty používají předponu 0 jako alias. Například:

echo $((010+010))

Hexadecimální (základ 16) výpočty umožňují použití 0x jako základní předpony. Například:

echo $((0xA+0xA))

Výstup vytiskne výsledek v základu deset pro jakýkoli výpočet.

Převést jednotky

Vytvořte jednoduchý skript Bash pro převod jednotek:

1. Otevřete textový editor, jako je Vim, a vytvořte convert.sh skript. Například:

vim convert.sh

2. Vložte následující kód:

#!/bin/bash

## Program for feet and inches conversion

echo "Enter a number to be converted:"

read number

echo $number feet to inches:
echo "$number*12" | bc -l

echo $number inches to feet:
echo "$number/12" | bc -l

Program používá čtení Bash k převzetí uživatelského vstupu a počítá převod ze stop na palce az palců na stopy.

3. Uložte skript a zavřete:

:wq

4. Spusťte skript Bash pomocí:

. convert.sh

Zadejte číslo a podívejte se na výsledek. Pro různé převody použijte vhodné převodní vzorce.

Řešení "chyba bash:hodnota je příliš velká pro základ"

Při práci s různými číselnými základnami dodržujte limity číselné základny. Například binární čísla používají k definování čísel 0 a 1:

echo $((2#2+2#2))

Pokus o použití 2#2 jako číslo vypíše chybu:

bash: 2#2: value too great for base (error token is "2#2")

Číslo nemá správný formát pro binární použití. Chcete-li chybu vyřešit, převeďte číslo na binární, aby se výpočet provedl správně:

echo $((2#10+2#10))

Binární číslo 10 je 2 v základu deset.

Řešení "chyba syntaxe:neplatný aritmetický operátor"

Bashova aritmetická expanzní notace funguje pouze pro celočíselné výpočty. Pokuste se přidat dvě čísla s plovoucí desetinnou čárkou, například:

echo $((2.1+2.1))

Příkaz vypíše chybu:

bash: 2.1+2.1: syntax error: invalid arithmetic operator (error token is ".1+2.1")

K vyřešení chyby použijte běžnou celočíselnou aritmetiku nebo jinou metodu výpočtu rovnice.

Řešení "chyby bash:očekává se celočíselný výraz"

Při porovnávání dvou čísel test příkaz vyžaduje celá čísla. Zkuste například následující příkaz:

[ 1 -gt 1.5 ]

Výstup vypíše chybu:

bash: [: 1.5: integer expression expected

Vyřešte chybu porovnáním celočíselných hodnot.


Linux
  1. Závorka v aritmetice výrazu:3 * (2 + 1)?

  2. příkaz pro export bash

  3. Spusťte příkaz bash na jenkins pipeline

  1. Vysvětlení příkazu Bash trap

  2. Bash čeká příkaz

  3. Bash četl příkaz

  1. Bash Heredoc

  2. Příkaz zdroje Bash

  3. Příkaz historie v Linuxu (Bash History)