Facciamo un po' di matematica!
Durante la scrittura dei tuoi script bash, ti ritroverai spesso a voler capire il risultato di un calcolo aritmetico per determinare lo spazio su disco rimanente, le dimensioni dei file, le date di scadenza delle password, il numero di host, la larghezza di banda della rete, ecc.
In questo capitolo della serie per principianti di bash imparerai a usare gli operatori bash per eseguire vari calcoli aritmetici.
Per rinfrescarti la memoria, ecco gli operatori aritmetici in bash:
Operatore | Descrizione |
---|---|
+ | Aggiunta |
- | Sottrazione |
* | Moltiplicazione |
/ | Divisione intera (senza numeri decimali) |
% | Divisione modulo (dà solo resto) |
** | esponenziale (x alla potenza y) |
Esecuzione di addizioni e sottrazioni negli script bash
Creiamo uno script bash chiamato addition.sh che aggiungerà semplicemente due dimensioni di file (in byte) e visualizzerà l'output.
A questo punto devi avere familiarità con gli argomenti negli script bash. Spero che anche tu abbia familiarità con i comandi cut and du.
Il comando du ti dà la dimensione del file lungo . L'output ha sia la dimensione del file che il nome del file. È qui che viene utilizzato il comando cut per estrarre la prima colonna (cioè la dimensione del file) dall'output. L'output del comando du viene passato al comando cut usando il reindirizzamento della pipe.
Ecco lo script:
#!/bin/bash
fs1=$(du -b $1 | cut -f1)
fs2=$(du -b $2 | cut -f1)
echo "File size of $1 is: $fs1"
echo "File size of $2 is: $fs2"
total=$(($fs1 + $fs2))
echo "Total size is: $total"
Nota che passerai i due nomi di file come argomenti allo script. Ad esempio, qui eseguo lo script e passo i due file /etc/passwd
e /etc/group
come argomenti:
[email protected]:~/scripts$ ./addition.sh /etc/passwd /etc/group
File size of /etc/passwd is: 2795
File size of /etc/group is: 1065
Total size is: 3860
La riga più importante in addition.sh lo script è:
total=$(($fs1 + $fs2))
Dove hai usato l'operatore + per sommare i due numeri $fs1 e $fs2. Si noti inoltre che per valutare qualsiasi espressione aritmetica è necessario racchiudere tra doppie parentesi come segue:
$((arithmetic-expression))
Puoi anche usare l'operatore meno (-) per la sottrazione. Ad esempio, il valore della sottovariabile nella seguente istruzione risulterà a sette:
sub=$((10-3))
Esecuzione di moltiplicazioni e divisioni negli script bash
Creiamo uno script bash chiamato giga2mega.sh che convertirà Gigabyte (GB) in Megabyte (MB):
#!/bin/bash
GIGA=$1
MEGA=$(($GIGA * 1024))
echo "$GIGA GB is equal to $MEGA MB"
Ora eseguiamo lo script per scoprire quanti Megabyte ci sono in quattro Gigabyte:
[email protected]:~/scripts$ ./giga2mega.sh 4
4 GB is equal to 4096 MB
Qui ho usato l'operatore di moltiplicazione (*) per moltiplicare il numero di Gigabyte per 1024 per ottenere l'equivalente in Megabyte:
MEGA=$(($GIGA * 1024))
È facile aggiungere più funzionalità a questo script per convertire Gigabyte (GB) in Kilobyte (KB):
KILO=$(($GIGA * 1024 * 1024))
Ti permetterò di convertire Gigabyte in byte come esercizio pratico!
Puoi anche usare l'operatore di divisione (/) per dividere due numeri. Ad esempio, il valore della variabile div nella seguente istruzione restituirà cinque:
div=$((20 / 4))
Si noti che questa è una divisione intera e quindi tutte le frazioni vengono perse. Ad esempio, se dividi 5 per 2, otterrai 2 che non è corretto, ovviamente:
[email protected]:~/scripts$ div=$((5 / 2))
[email protected]:~/scripts$ echo $div
2
Per ottenere un output decimale; puoi utilizzare il bc
comando. Ad esempio, per dividere 5 per 2 con il bc
comando, puoi usare la seguente istruzione:
echo "5/2" | bc -l
2.50000000000000000000
Nota che puoi usare anche altri operatori con bc
comando ogni volta che hai a che fare con numeri decimali:
Utilizzo di potenza e resto (modulo)
Creiamo un calcolatore di potenza! Creerò uno script chiamato power.sh che accetterà due numeri a e b (come argomenti) e visualizzerà il risultato di a elevato al potere di b :
#!/bin/bash
a=$1
b=$2
result=$((a**b))
echo "$1^$2=$result"
Nota che utilizzo l'operatore di esponenziazione (**) per calcolare il risultato di a elevato al potere di b .
Eseguiamo alcune esecuzioni dello script per assicurarci che fornisca le risposte corrette:
[email protected]:~/scripts$ ./power.sh 2 3
2^3=8
[email protected]:~/scripts$ ./power.sh 3 2
3^2=9
[email protected]:~/scripts$ ./power.sh 5 2
5^2=25
[email protected]:~/scripts$ ./power.sh 4 2
4^2=16
È inoltre possibile utilizzare l'operatore modulo (%) per calcolare i resti interi. Ad esempio, il valore del rem variabile nella seguente istruzione restituirà 2:
rem=$((17%5))
Il resto qui è 2 perché 5 va in 17 tre volte e due rimangono!
Tempo di esercitazione:crea uno script bash per il convertitore di laurea
Concludiamo questo tutorial creando uno script chiamato c2f.sh che convertirà i gradi Celsius in gradi Fahrenheit usando l'equazione seguente:
F = C x (9/5) + 32
Questo sarà un buon esercizio per provare le nuove cose che hai appena imparato in questo tutorial di bash.
Ecco una soluzione (potrebbero esserci diversi modi per ottenere lo stesso risultato):
#!/bin/bash
C=$1
F=$(echo "scale=2; $C * (9/5) + 32" | bc -l)
echo "$C degrees Celsius is equal to $F degrees Fahrenheit."
Ho usato il bc comando perché abbiamo a che fare con i decimali e ho anche usato "scale=2" per visualizzare l'output in due punti decimali.
Eseguiamo alcune esecuzioni dello script per assicurarci che produca i risultati corretti:
[email protected]:~/scripts$ ./c2f.sh 2
2 degrees Celsius is equal to 35.60 degrees Fahrenheit.
[email protected]:~/scripts$ ./c2f.sh -3
-3 degrees Celsius is equal to 26.60 degrees Fahrenheit.
[email protected]:~/scripts$ ./c2f.sh 27
27 degrees Celsius is equal to 80.60 degrees Fahrenheit.
Perfetto! Questo ci porta alla fine di questo tutorial. Metti in pratica ciò che hai imparato scaricando il set di esercizi bash di questo capitolo.
Bash Capitolo 5 Domande pratiche Problemi e la loro soluzione per mettere in pratica ciò che hai appena imparato in questo capitolo Bash-Capitolo-5-Domande pratiche-Linux-Handbook.pdf32 KB
Spero che ti sia piaciuto fare un po' di matematica con bash e resta sintonizzato per il prossimo tutorial della serie per principianti di bash mentre imparerai a manipolare le corde!