Dlaczego bash uważa, że ​​010 to 8?

17

Dlaczego bash myśli, że liczba 010 = 8?

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

Myślałem, że to może być binarne, ale 010 = 10 = 2. Więc dlaczego dostaje 8, i jak mogę sprawić, żeby myślał 010 = 10 (i 010 - 2 = 8)?

Tim
źródło
15
Prowadzący 0mówi, że jest ósemkowy. Jeśli po prostu zrobić x=10następnie echo $((x+0))następnie pokazy 10. Ponadto nie ma potrzeby stosowania dodatkowej opcji $w ().
Terrance
2
W wielu parserach liczb 010oznacza 8, ponieważ wstawienie z 0przodu oznacza liczbę ósemkową, podobnie jak 0xw niektórych językach oznacza hex.
Derek 朕 會 功夫
9
Jest to właściwie ważna rzecz, którą należy wiedzieć podczas programowania. W większości języków 0wyzwala liczbę ósemkową, 0xszesnastkową i 0bbinarną.
Seth
Objaśnienia?
Tim
3
@tim dlaczego miałoby to nie być 8? ;-) Ale nie moja opinia, ale prawdopodobnie dlatego, że jest zbyt podstawowa. To jest całkiem normalne zachowanie.
Rinzwind,

Odpowiedzi:

42

Sekwencje liczb zaczynające się od a 0są interpretowane jako liczby ósemkowe.
Oktalowy 10= dziesiętny 8.

Aby bash traktował go jako liczbę dziesiętną, usuń wiodące zero lub wymuś dziesiętne za pomocą:

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

Zasadniczo działa to dla wszystkich baz, wystarczy zastąpić 10bazę, którą chcesz:

N=[base#]n
Pabi
źródło
Edytowałem pytanie na dwa sposoby, aby je rozwiązać.
Pabi
1
@ Czas, aby to zrobić, możesz użyć $ {N%?}, Aby posiekać ostatnią cyfrę, a następnie {N: -}, aby zamienić puste na 0.
Random832
@ Czas, jeśli tak, nie mogłem wymyślić, jak to zrobić. $ {$ {N%?}: - 0} działa w zsh, ale nie w bash ani ksh. (Również :-w moim komentarzu powyżej powinno być :-0}
Random832
Powinieneś zawrzeć w swojej odpowiedzi, że możesz wymusić dowolną podstawę za pomocą „ formularza [baza #] n, gdzie podstawa jest liczbą dziesiętną między 2 a 64 reprezentującą podstawę arytmetyczną, a n jest liczbą w tej bazieźródło: bash ref
djeikyb