8.2. Les constantes numériques

Un script shell interprète un nombre comme un décimal (base 10), sauf si ce nombre porte un certain préfixe ou notation. Un nombre précédé d'un 0 est octal (base 8). Un nombre précédé par 0x est hexadécimal (base 16). Un nombre comprenant un # est évalué comme BASE#NOMBRE (avec les restrictions correspondantes d'intervalle et de codification).

Exemple 8.4. Représentation des constantes numériques

#!/bin/bash
# numbers.sh: Représentation des nombres en différentes bases.

# Décimal: par défaut
let "dec = 32"
echo "nombre décimal = $dec"             # 32
# Jusqu'ici, rien d'extraordinaire.

# Octal: nombres précédés par '0' (zero)
let "oct = 032"
echo "nombre octal = $oct"               # 26
# Exprime le résultat en décimal.
# ------- -- -------- -- -------

# Hexadecimal: nombres précédés par '0x' ou '0X'
let "hex = 0x32"
echo "nombre hexadécimal = $hex"         # 50

echo $((0x9abc))                         # 39612
#     ^^      ^^   expansion/évaluation arithmétique entre parenthèses
# Exprime le résultat en décimal.



# Autres bases: BASE#NOMBRE
# BASE entre 2 et 64.
# NUMBER doit utiliser les symboles compris dans l'intervalle BASE, voir ci-dessous.

let "bin = 2#111100111001101"
echo "nombre binaire = $bin"              # 31181

let "b32 = 32#77"
echo "nombre en base 32 = $b32"             # 231

let "b64 = 64#@_"
echo "nombre en base 64 = $b64"             # 4031
# Cette notation fonctionne seulement pour un intervalle limité
# (2-64) de caractères ASCII
# 10 chiffres + 26 caractères minuscules + 26 caractères majuscules + @ + _

echo

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

#  Note importante:
#  ----------------
#  Utiliser un chiffre en dehors de l'échelle de la notation spécifiée
#+ donne un message d'erreur.

let "bad_oct = 081"
# Message d'erreur (partiel) en sortie:
# bad_oct = 081 : valeur trop élevée pour la base (l'erreur est "081")
# Les nombres octal utilisent seulement des chiffres dans l'intervalle 0 - 7.

exit 0   # Merci à Rich Bartell et Stephane Chazelas pour cette clarification.