Introduzione
Le operazioni matematiche e aritmetiche sono essenziali negli script Bash. Varie attività di automazione richiedono operazioni aritmetiche di base, come la conversione della temperatura della CPU in Fahrenheit. L'implementazione di operazioni matematiche in Bash è semplice e molto facile da imparare.
Questa guida ti insegna come eseguire la matematica di base in Bash in vari modi.
Prerequisiti
- Accesso alla riga di comando/terminale.
- Un editor di testo per codificare esempi, come nano o Vi/Vim.
- Conoscenza di base dello scripting Bash.
Perché hai bisogno di matematica in Bash Scripting?
Sebbene la matematica non sia lo scopo principale degli script Bash, sapere come eseguire calcoli essenziali è utile per vari casi d'uso.
I casi d'uso comuni includono:
- Somma/sottrazione/moltiplicazione/divisione di numeri.
- Numeri arrotondati.
- Numeri in aumento e in diminuzione.
- Conversione di unità.
- Calcoli a virgola mobile.
- Trovare le percentuali.
- Lavorare con basi numeriche diverse (binarie, ottali o esadecimali).
A seconda dell'attività di automazione, la matematica e l'aritmetica di base negli script Bash aiutano a eseguire un calcolo rapido, ottenendo risultati immediati nel formato desiderato.
Comandi e metodi matematici di Bash
Alcuni comandi Linux consentono di eseguire immediatamente calcoli di base e avanzati. Questa sezione mostra esempi di matematica di base con ciascun metodo.
Espansione aritmetica
Il modo migliore per fare matematica in Bash è usare l'espansione aritmetica della shell. La funzionalità integrata valuta le espressioni matematiche e restituisce il risultato. La sintassi per le espansioni aritmetiche è:
$((expression))
La sintassi è composta da:
- Notazione composta
(())
che valuta l'espressione. - L'operatore variabile
$
per memorizzare il risultato.
Ad esempio, aggiungi due numeri e fai eco al risultato:
echo $((2+3))
La notazione di espansione aritmetica è il metodo preferito quando si lavora con gli script Bash. La notazione è spesso vista insieme a if
istruzioni e cicli for in Bash.
Comando awk
Il comando awk funge da selettore per le espressioni di pattern. Ad esempio, per eseguire l'addizione utilizzando awk
comando, utilizzare la seguente istruzione di esempio:
awk 'BEGIN { x = 2; y = 3; print "x + y = "(x+y) }'
Per le variabili x = 2
e y = 3
, l'output stampa x + y = 5
alla console.
Comando bc
Il bc
comando (abbreviazione di b asic c alculator) è un'utilità della riga di comando che esegue il rendering del linguaggio bc. Il programma viene eseguito come un programma interattivo o accetta input standard per eseguire operazioni aritmetiche di precisione arbitraria.
Convogliare un'equazione dallo standard input nel comando per recuperare i risultati. Ad esempio:
echo "2+3" | bc
L'output stampa il risultato del calcolo.
Comando dc
Il dc
comando (abbreviazione di d chiedi c alculator) è un'utilità calcolatrice che supporta la notazione polacca inversa. Il programma accetta input standard e supporta l'aritmetica di precisione illimitata.
Inserisci un'equazione di input standard nel comando per recuperare il risultato. Ad esempio:
echo "2 3 + p" | dc
Il p
nell'equazione invia il segnale di stampa al dc
comando.
dichiara Comando
Il comando Bash dichiara consente il calcolo di interi. Per utilizzare declare
per i calcoli, aggiungi il -i
opzione. Ad esempio:
declare -i x=2 y=3 z=x+y
Echo ogni variabile per vedere i risultati:
echo $x + $y = $z
L'output stampa ogni variabile sulla console.
comando espr
Il expr
command è un'utilità della riga di comando legacy per la valutazione dell'aritmetica di interi. Un esempio expr
il comando è simile al seguente:
expr 2 + 3
Separare i numeri e il segno dell'operazione con spazi ed eseguire il comando per vedere il risultato del calcolo.
Comando fattore
Il factor
command è un'utilità della riga di comando che stampa i fattori per qualsiasi intero positivo e il risultato fattorizza in numeri primi.
Ad esempio, per stampare i fattori del numero 100, eseguire:
factor 100
L'output stampa il numero fattorizzato.
lascia il comando
Il comando Bash let esegue varie operazioni aritmetiche, bit per bit e logiche. Il comando integrato funziona solo con numeri interi. L'esempio seguente mostra il let
sintassi del comando:
let x=2+3 | echo $x
L'output stampa i risultati.
Test comando
Il test
Il comando in Linux valuta le espressioni condizionali e spesso si accoppia con l'istruzione if di Bash. Esistono due varianti per la sintassi del test:
test 2 -gt 3; echo $?
O in alternativa:
[ 2 -gt 3 ]; echo $?
Il test
comando valuta se due è maggiore di (-gt
) tre. Se l'espressione è vera, l'output è zero (0
) o uno (1
) se falso.
Operatori aritmetici Bash
Bash offre un'ampia gamma di operatori aritmetici per vari calcoli e valutazioni. Gli operatori lavorano con il let
, declare
e espansione aritmetica.
Di seguito è riportata una tabella di riferimento rapido che descrive gli operatori aritmetici di Bash e le loro funzionalità.
Sintassi | Descrizione |
---|---|
++x , x++ | Pre e post-incremento. |
--x , x-- | Pre e post-decremento. |
+ , - , * , / | Addizione, sottrazione, moltiplicazione, divisione. |
% , ** (o ^ ) | Modulo (resto) ed esponenziazione. |
&& , || , ! | AND logico, OR e negazione. |
& , | , ^ , ~ | AND bit a bit, OR, XOR e negazione. |
<= , < , > , => | Minore o uguale a, minore, maggiore e maggiore o uguale agli operatori di confronto. |
== , != | Operatori di confronto di uguaglianza e disuguaglianza. |
= | Operatore di assegnazione. Si combina con altri operatori aritmetici. |
Come fare matematica in Bash
Bash offre diversi modi per eseguire calcoli matematici a seconda del tipo di problema.
Di seguito sono riportati alcuni esempi di problemi comuni che utilizzano le funzionalità o i comandi matematici di Bash come soluzione. La maggior parte degli esempi utilizza la notazione di espansione aritmetica di Bash. La sezione tratta anche gli errori matematici comuni di Bash e come risolverli.
Matematica con numeri interi
La notazione di espansione aritmetica è la più semplice da usare e manipolare quando si lavora con numeri interi. Ad esempio, crea un'espressione con variabili e calcola immediatamente il risultato:
echo $((x=2, y=3, x+y))
Per valutare più espressioni, utilizzare la notazione composta, memorizzare ogni calcolo in una variabile e fare eco al risultato. Ad esempio:
((x=2, y=3, a=x+y, b=x*y, c=x**y)); echo $a, $b, $c
Quando provi a dividere, tieni presente quanto segue:
1. La divisione per zero (0) è impossibile e genera un errore.
2. L'espansione aritmetica di Bash non supporta l'aritmetica in virgola mobile. Quando si tenta di dividere in questo caso, l'uscita mostra zero (0).
Il risultato della divisione di interi deve essere un intero.
Incremento e decremento
L'espansione aritmetica di Bash utilizza l'incremento e il decremento di interi in stile C. L'operatore per l'incremento o il decremento è prima o dopo la variabile, producendo un comportamento diverso.
Se l'operatore è prima della variabile (++x
o --x
), l'incremento o il decremento avviene prima dell'assegnazione del valore. Per vedere come funziona il pre-incremento, esegui le seguenti righe:
number=1
echo $((++number))
La variabile aumenta e il nuovo valore è immediatamente disponibile.
Se l'operatore è dopo la variabile (x++
o x--
), l'incremento o il decremento avviene dopo l'assegnazione del valore. Per vedere come funziona il post-incremento, esegui quanto segue:
number=1
echo $((number++))
echo $number
La variabile rimane la stessa e si incrementa nell'uso successivo.
Aritmetica in virgola mobile
Sebbene l'espansione aritmetica di Bash non supporti l'aritmetica in virgola mobile, esistono altri modi per eseguire tali calcoli. Di seguito sono riportati quattro esempi di utilizzo di comandi o linguaggi di programmazione disponibili sulla maggior parte dei sistemi Linux.
1. Utilizzo di awk
fino a 6 cifre decimali:
awk 'BEGIN { x = 2.3; y = 3.2; print "x * y = "(x * y) }'
2. Utilizzando bc
con il -l
flag fino a 20 cifre decimali:
echo "2.3 * 3.2" | bc -l
3. Utilizzo di Perl fino a 20 cifre decimali:
perl -e 'print 2.3*3.2'
Perl viene spesso preinstallato nei sistemi Linux.
4. Usare printf e l'espansione aritmetica per convertire una frazione in decimale:
printf %.<precision>f "$((10**<multiplier> * <fraction>))e-<multiplier>"
La precisione determina quante cifre decimali, mentre il moltiplicatore è una potenza di dieci. Il numero dovrebbe essere inferiore al moltiplicatore. In caso contrario, la formula inserisce zeri finali nel risultato.
Ad esempio, converti 1/3 in un decimale con precisione due:
printf %.2f "$((10**3 * 1/3))e-3"
Evita questo metodo per calcoli precisi e usalo solo per un numero ridotto di cifre decimali.
Calcolo di una percentuale e arrotondamento
Di seguito sono riportati due modi per calcolare una percentuale in Bash.
1. Usa printf
con espansione aritmetica.
printf %.2f "$((10**4 * part/total))e-4"%
Ad esempio, calcola quale percentuale 40 è da 71:
printf %.2f%% "$((10**4 * 40/71))e-4"%
La precisione è limitata a due cifre decimali e la risposta viene sempre arrotondata per difetto.
2. Usa awk
con printf
per una migliore precisione:
awk 'BEGIN { printf "%.2f%%", (part/total*100) }'
Ad esempio, calcola quanta percentuale è 40 da 71 con:
awk 'BEGIN { printf "%.2f%%", (40/71*100) }'
La risposta arrotonda per eccesso se la terza cifra decimale è maggiore di cinque, fornendo una migliore precisione.
Trovare un fattoriale nella shell
Per calcolare un fattoriale per qualsiasi numero, utilizzare una funzione Bash ricorsiva.
Per piccoli numeri, l'espansione aritmetica di Bash funziona bene:
factorial () {
if (($1 > 1))
then
echo $(( $( factorial $(($1 - 1)) ) * $1 ))
else
echo 1
return
fi
}
Per controllare il fattoriale per un numero, usa la seguente sintassi:
factorial 5
Il metodo è lento e ha una precisione limitata (fino a fattoriale 20).
Per una maggiore precisione, risultati più rapidi e numeri più grandi, utilizza il bc
comando. Ad esempio:
echo 'define factorial(x) {if (x>1){return x*factorial(x-1)};return 1}
factorial(<number>)' | bc
Sostituisci <number>
con il numero fattoriale da calcolare. Ad esempio, per trovare il fattoriale di 50, usa:
echo 'define factorial(x) {if (x>1){return x*factorial(x-1)};return 1} factorial(50)' | bc
L'output stampa il risultato del calcolo sul terminale.
Creazione di una funzione di calcolatrice Bash
Crea una semplice funzione calcolatrice Bash con il seguente codice:
calculate() { printf "%s\n" "[email protected]" | bc -l; }
La funzione accetta l'input dell'utente e convoglia l'equazione nel bc
comando.
In alternativa, per evitare di usare programmi, usa l'espansione aritmetica di Bash in una funzione:
calculate() { echo $(("[email protected]")); }
Tieni a mente i limiti dell'espansione aritmetica. L'aritmetica in virgola mobile non è disponibile con questa funzione.
Salva la funzione nel .bashrc file per avere sempre la funzione disponibile nella shell.
Utilizzo di basi aritmetiche diverse
Per impostazione predefinita, l'espansione aritmetica di Bash utilizza numeri in base dieci. Per modificare la base numerica, utilizzare il seguente formato:
base#number
Dove base è un numero intero compreso tra due e 64.
Ad esempio, per eseguire un calcolo binario (base 2), utilizzare:
echo $((2#1010+2#1010))
I calcoli ottali (base 8) utilizzano un prefisso 0 come alias. Ad esempio:
echo $((010+010))
I calcoli esadecimali (base 16) consentono di utilizzare 0x come prefisso di base. Ad esempio:
echo $((0xA+0xA))
L'output stampa il risultato in base dieci per qualsiasi calcolo.
Converti unità
Crea un semplice script Bash per convertire le unità:
1. Apri un editor di testo, come Vim, e crea un convert.sh sceneggiatura. Ad esempio:
vim convert.sh
2. Incolla il seguente codice:
#!/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
Il programma utilizza Bash read per prendere l'input dell'utente e calcola la conversione da piedi a pollici e da pollici a piedi.
3. Salva lo script e chiudi:
:wq
4. Esegui lo script Bash con:
. convert.sh
Inserisci un numero e guarda il risultato. Per conversioni diverse, utilizza le formule di conversione appropriate.
Risolto "errore bash:valore troppo grande per base"
Quando si lavora con basi numeriche diverse, mantenersi entro i limiti delle basi numeriche. Ad esempio, i numeri binari utilizzano 0 e 1 per definire i numeri:
echo $((2#2+2#2))
Tentativo di utilizzare 2#2
come numero restituisce un errore:
bash: 2#2: value too great for base (error token is "2#2")
Il numero non è il formato corretto per l'uso binario. Per risolvere l'errore, converti il numero in binario per eseguire correttamente il calcolo:
echo $((2#10+2#10))
Il numero binario 10
è 2
in base dieci.
Risolto "errore di sintassi:operatore aritmetico non valido"
La notazione di espansione aritmetica di Bash funziona solo per i calcoli di interi. Prova ad aggiungere due numeri in virgola mobile, ad esempio:
echo $((2.1+2.1))
Il comando stampa un errore:
bash: 2.1+2.1: syntax error: invalid arithmetic operator (error token is ".1+2.1")
Per risolvere l'errore, usa l'aritmetica dei numeri interi regolari o un metodo diverso per calcolare l'equazione.
Risolto "errore bash:attesa espressione intera"
Quando si confrontano due numeri, il test
il comando richiede numeri interi. Ad esempio, prova il seguente comando:
[ 1 -gt 1.5 ]
L'output stampa un errore:
bash: [: 1.5: integer expression expected
Risolvi l'errore confrontando i valori interi.