Por que o bash pensa: 016 + 1 = 15?

60

Alguém pode me explicar por que um número com 0 líder dá esse comportamento engraçado?

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

imprimirá:

016 + 1 = 15

    
por DeltaLima 08.01.2015 / 16:24

2 respostas

128

O mal-entendido é que os números não significam o que você espera.

Um zero inicial indica um número com base 8. i.e. 016 é o mesmo que 8#16 . Se você quiser manter o zero inicial, precisará de 10#016 .

> num=016
> echo $((num))
14
> echo $((10#$num))
16
    
por 08.01.2015 / 16:29
42

Porque:

~$ echo $((NUM))
14

se o número começa com 0, é considerado um valor octal e 16 em octal é 14 em decimal.

    
por 08.01.2015 / 16:27

Tags