Pourquoi bash pense que 010 est 8?

17

Pourquoi bash pense-t-il que le nombre 010 = 8?

x=010
echo $x
  010
echo $(( x+0 ))
  8
echo $(( x-2 ))
  6

Je pensais que cela pourrait être binaire, mais 010 = 10 = 2. Alors pourquoi obtient-il 8 et comment puis-je le faire penser 010 = 10 (et 010 - 2 = 8)?

Tim
la source
15
Le premier lui 0dit qu'il est octal. Si vous venez de le faire, x=10alors ça echo $((x+0))se voit 10. De plus, il n'y a pas besoin de supplément $avec ().
Terrance
2
Dans de nombreux analyseurs numériques, 010signifie 8 car en mettant un 0devant signifie octal, semblable à la façon dont mettre 0xdans certaines langues signifie hex.
Derek 朕 會 功夫
9
C'est en fait une chose importante à savoir lors de la programmation. Dans la plupart des langues, 0déclenche octal, 0xhex et 0bbinaire.
Seth
Downvote explications?
Tim
3
@tim pourquoi ne serait-il pas-8? ;-) Oh mais pas mon downvote mais probablement parce que c'est trop basique. C'est un comportement assez normal.
Rinzwind

Réponses:

42

Les séquences de nombres commençant par a 0sont interprétées comme des nombres octaux.
Octal 10= décimal 8.

Pour que bash le traite comme un nombre décimal, supprimez le premier zéro ou forcez la décimale avec:

N=010
N=$((10#$N))

Généralement, cela fonctionne pour toutes les bases, remplacez simplement le 10par la base que vous souhaitez:

N=[base#]n
Pabi
la source
Modifié la question de deux manières pour la résoudre.
Pabi
1
@Tim pour ce faire, vous pouvez utiliser $ {N%?} Pour hacher le dernier chiffre, puis $ {N: -} pour remplacer le blanc par 0.
Random832
@Tim si c'est le cas, je n'ai pas pu comprendre comment. $ {$ {N%?}: - 0} fonctionne en zsh mais pas en bash ou ksh. (Aussi, :-dans mon commentaire ci-dessus aurait dû être :-0}
Random832
Vous devez inclure dans votre réponse que vous pouvez forcer n'importe quelle base avec la " forme [base #] n, où base est un nombre décimal entre 2 et 64 représentant la base arithmétique, et n est un nombre dans cette base " source: bash ref
djeikyb