Comme en langage C, un littéral entier (valeur de type entier) qui ne commence pas par le chiffre 0 est considéré comme étant exprimé en base décimale (ex : 11, -234). Un littéral qui commence par le chiffre 0 est interprété comme un nombre octal (ex : 071). S’il débute par 0x ou 0X, il est interprété comme un nombre hexadécimal (ex : 0xA, 0X0d) : les minuscules et majuscules ne sont pas distinguées.
Bash permet d’exprimer des nombres dans une base allant de 2 à 64. On utilise pour cela la syntaxe : base#a
Toutefois, les résultats seront exprimés en base décimale.
Dans l’exemple ci-dessous, 023 est exprimée en base 8 et 3#11 est exprimée en base 3. En base 10, il s’agit des valeurs 19 et 4.
$ declare -i a="023 + 3#11" $ $ echo $a 23 => le résultat est exprimé en base 10 $ $ echo 3#$a 3#23 => tentative infructueuse pour exprimer le résultat en base 3 ! $
La commande interne printf accepte en arguments des entiers exprimés en base 10, 8 ou 16.
$ printf "%d %d %d\n" 23 023 0x23 23 19 35 => valeurs exprimées en décimal $
Inversement, elle est capable d’afficher une valeur directement dans une de ces trois bases. Dans la chaîne format de printf, on utilise la syntaxe :
%d pour afficher en décimal un entier quelconque
%u pour afficher en décimal un entier non signé
%o pour afficher en octal un entier non signé
%x ou %X pour afficher en hexadécimal un entier non signé
$ printf "%o\n" 23 27 => valeur décimale 23 exprimée en octal $