11.2. Représentation d’une valeur de type entier

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
$