Bash neden düşünüyor: 016 + 1 = 15?


60

Birisi bana neden 0 öncüsü olan bir sayı bu komik davranışı verdiğini açıklayabilir mi?

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

Yazdıracak:

016 + 1 = 15


3
Psst: printf "%03d\n" 10dosya isimleri ve benzerleri için baştaki bir sıfır elde etmek için bash'te tamamen kullanılabilir.
Sıkı

@Squeezy Teşekkürler, ama bu kısmı zaten çalışıyordu. Asıl sorun, baştaki 0 ​​olan bir dosya adı elde etmekti. Dosya adının en yüksek sayıya sahip olduğunu bulmak ve ardından sıradaki sıradaki printf "prefix-% 03d.tif" $ SUM kullanarak.
DeltaLima

8
Bunu sadece kendiniz çözerek yapabileceğinizi unutmayınecho $((016))
Mehrdad

2
Bilginize, bu birçok programlama dilinde geçerlidir: C, C ++, Javascript.
Paul Draper

Yanıtlar:


128

Yanlış anlama, sayıların beklediğiniz anlamına gelmediğidir.

Baştaki sıfır, 8 numaralı tabanı olan bir sayıya işaret eder. Yani 016, aynıdır 8#16. Önde gelen sıfırı korumak istiyorsanız, o zaman ihtiyacınız var 10#016.

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

23
Dünyada 10 tip insan var. İkili anlayanlar, bilmeyenler, üs 8 şakası beklemeyenler, ve diğer 5 insan türü.
Jon Story

42

Çünkü:

~$ echo $((NUM))
14

sayı 0 ile başlıyorsa, sekizlik bir değer olarak kabul edilir ve sekizlikte 16, ondalık sayıda 14'tür.


2
Benim senaryom :-( benim eski dosyalar üzerine işte bu yüzden mükemmel sence yapar ve açıklar
DeltaLima
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.