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.