Pourquoi bash pense-t-il: 016 + 1 = 15?


60

Quelqu'un peut-il m'expliquer pourquoi un nombre avec un 0 mène à ce comportement amusant?

#!/bin/bash
NUM=016 
SUM=$((NUM + 1)) 
echo "$NUM + 1 = $SUM"

Imprimera:

016 + 1 = 15


3
Psst: printf "%03d\n" 10est complètement utilisable dans bash pour obtenir un zéro non significatif pour les noms de fichiers et autres.
Squeezy

@Squeezy Merci, mais cette partie fonctionnait déjà. Le problème réel n’était pas d’obtenir un nom de fichier avec un 0 initial. C’était de rechercher le nom de fichier portant le numéro le plus élevé, puis de créer le suivant dans l’ordre en utilisant printf "prefix-% 03d.tif" $ SUM.
DeltaLima

8
Notez que vous auriez pu comprendre cela vous-même en faisant celaecho $((016))
Mehrdad

2
Pour votre information, cela est vrai dans de nombreux langages de programmation: C, C ++, Javascript.
Paul Draper

Réponses:


128

Le malentendu est que les chiffres ne veulent pas dire ce que vous attendez.

Un zéro au début indique un nombre de base 8. Ce 016est le même que 8#16. Si vous voulez conserver le zéro non significatif, il vous faut 10#016.

> num=016
> echo $((num))
14
> echo $((10#$num))
16

23
Il y a 10 types de personnes dans le monde. Ceux qui comprennent le binaire, ceux qui ne comprennent pas, ceux qui ne s'attendaient pas à une blague de base 8, et 5 autres types de personnes.
Jon Story

42

Parce que:

~$ echo $((NUM))
14

si le nombre commence par 0, il est considéré comme une valeur octale et 16 en octal est 14 en décimal.


2
Cela fait sens et explique pourquoi mon script
remplaçait
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.