8.2. Costanti numeriche

Lo script di shell interpreta un numero come numero decimale (base 10), tranne quando quel numero è scritto in una notazione particolare o con un prefisso specifico. Un numero preceduto da 0 è un numero ottale (base 8). Un numero preceduto da 0x è un numero esadecimale (base 16). Un numero contenente un # viene valutato come BASE#NUMERO (con limitazioni di notazione ed ampiezza).

Esempio 8-4. Rappresentazione di costanti numeriche

#!/bin/bash
# numbers.sh: Rappresentazione di numeri con basi differenti.

# Decimale: quella preimpostata
let "dec = 32"
echo "numero decimale = $dec"             # 32
# Qui non c'è niente di insolito.


# Ottale: numeri preceduti da '0' (zero)
let "oct = 032"
echo "numero ottale = $ott"               # 26
# Risultato visualizzato come decimale.
# --------- ------------ ---- --------


# Esadecimale: numeri preceduti da '0x' o '0X'
let "esa = 0x32"
echo "numero esadecimale = $esa"          # 50

echo $((0x9abc))                          # 39612
#     ^^      ^^   espansione/valutazione aritmetica 
#                  per mezzo del costrutto doppie-parentesi
# Risultato visualizzato come decimale.



#  Altre basi: BASE#NUMERO
#  BASE tra 2 e 64.
#  NUMERO deve essere formato dai simboli nell'intervallo indicato da 
#+ BASE, vedi di seguito.


let "bin = 2#111100111001101"
echo "numero binario = $bin"              # 31181

let "b32 = 32#77"
echo "numero in base 32 = $b32"           # 231

let "b64 = 64#@_"
echo "numero in base 64 = $b64"           # 4031
#
#  Questa notazione funziona solo per un intervallo limitato (2 - 64)
#+ di caratteri ASCII
#  10 cifre + 26 caratteri minuscoli + 26 caratteri maiuscoli + @ + _


echo

echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
                                          # 1295 170 44822 3375


#  Nota importante:
#  ---------------
#  Utilizzare un simbolo al di fuori dell'intervallo della base specificata
#+ provoca un messaggio d'errore.

let "ott_errato = 081"
# Messaggio (parziale) d'errore visualizzato:
#  ott_errato = 081: value too great for base 
#+ (error token is "081")
#             I numeri ottali utilizzano solo cifre nell'intervallo 0 - 7.

exit 0       # Grazie, Rich Bartell e Stephane Chazelas, per il chiarimento.