Come tutto è file in Linux, tutto è stringa in bash.
Sì! Tecnicamente, non ci sono tipi di dati in Bash. In sostanza, le variabili Bash sono solo stringhe di caratteri.
E questo crea un problema quando si tenta di eseguire operazioni aritmetiche in bash. I numeri che provi ad aggiungere ti danno risultati strani.
[email protected]:~$ sum=3+6
[email protected]:~$ echo $sum
3+6
Per convertire le stringhe in numeri interi in bash, avvolgili in $((X)). In questo modo:
$((string))
Se la stringa ha un numero identificabile, verrà trattata come un numero. L'esempio che ho mostrato sopra può essere corretto come:
[email protected]:~$ sum=$((3+6))
[email protected]:~$ echo $sum
9
Tutto ciò che fai all'interno di $((...)) è considerato un'operazione aritmetica. Vediamo un po' più in dettaglio la conversione delle stringhe in numeri in modo da poter utilizzare i calcoli aritmetici in bash.
Conversione di variabili stringa in numeri
Dichiariamo alcuni "numeri" che sono fondamentalmente stringhe di caratteri.
[email protected]:~$ a=11
[email protected]:~$ b=3
Puoi controllare il numero assegnato:
[email protected]:~$ echo $a
11
[email protected]:~$ echo $b
3
Proviamo ora ad aggiungere entrambi i numeri e memorizzare il valore in una terza variabile c
:
[email protected]:~$ c=$a+$b
[email protected]:~$ echo $c
11+3
Come puoi vedere nell'output sopra, c viene anche trattato come una stringa.
Per fare in modo che l'aggiunta abbia successo, devi "convertirla" attraverso un'espansione aritmetica:
[email protected]:~$ c=$(($a+$b))
[email protected]:~$ echo $c
14
Tieni presente che c
è ancora in realtà una stringa, fino a quando non utilizzerai nuovamente la stessa espansione aritmetica per un'altra operazione di cui parlerò tra poco.
[email protected]:~$ c=$((5))
Quanto sopra equivale a:
[email protected]:~$ c=5
Usiamo una terza variabile d
per un'altra operazione:
[email protected]:~$ d=10
Tutte queste dichiarazioni implicite sono ancora stringhe. È lo stesso di come avevo definito a
e b
prima.
Ora per la seconda operazione:
[email protected]:~$ e=$(($a+$b*$c-$d))
[email protected]:~$ echo $e
16
Nell'espressione precedente, viene calcolato prima il prodotto di b e c e infine seguono l'addizione e la sottrazione.
Come accennato in precedenza, qualsiasi cosa tu faccia tra $((...)) è considerata un'operazione aritmetica.
Tutta questa conversione funziona per numeri interi. Non funzionerà con virgola mobile, ovvero numeri con punti decimali.Prova a mescolare stringhe e numeri reali
Mescolare stringhe e numeri interi è ancora più sicuro che mescolare coca cola e menta. Tuttavia, produce uno strano risultato.
[email protected]:~$ sum=$((3+hello))
[email protected]:~$ echo $sum
3
Funzionerà solo quando ci sono numeri (come stringa). Se è pura stringa di caratteri, non verrà magicamente convertita in alcuni numeri. Invece, viene ignorato come puoi vedere nell'esempio sopra.
Metodo alternativo:usa expr
Puoi anche usare expr
strumento per eseguire la valutazione, ma tieni presente che non è una procedura Bash "nativa", poiché è necessario disporre di coreutils
installato (per impostazione predefinita su Ubuntu) come pacchetto separato.
[email protected]:~$ expr $a + $b \* $c - $d
16
Spero che questo breve tutorial ti abbia aiutato a valutare le stringhe bash come numeri. Se hai domande o suggerimenti, sentiti libero di lasciare un commento qui sotto.