Mengapa bash berpikir: 016 +1 = 15?


60

Adakah yang bisa menjelaskan kepada saya mengapa angka dengan angka 0 memberi perilaku lucu ini?

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

Akan dicetak:

016 + 1 = 15


3
Psst: printf "%03d\n" 10sepenuhnya dapat digunakan dalam bash untuk mendapatkan nol di depan untuk nama file dan semacamnya.
Remeh

@ Squeezy Terima kasih, tetapi bagian itu sudah berfungsi. Masalah sebenarnya adalah tidak mendapatkan nama file dengan awalan 0. Itu mencari tahu nama file dengan angka tertinggi dan kemudian membuat urutan berikutnya, dengan menggunakan printf "prefix-% 03d.tif" $ SUM.
DeltaLima

8
Perhatikan bahwa Anda bisa mengetahuinya sendiri hanya dengan melakukanecho $((016))
Mehrdad

2
FYI, ini benar dalam banyak bahasa pemrograman: C, C ++, Javascript.
Paul Draper

Jawaban:


128

Kesalahpahamannya adalah bahwa angka tidak berarti apa yang Anda harapkan.

Angka nol di depan menunjukkan angka dengan basis 8. Yaitu 016sama dengan 8#16. Jika Anda ingin tetap memimpin nol maka Anda perlu 10#016.

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

23
Ada 10 tipe orang di dunia. Mereka yang mengerti biner, mereka yang tidak, mereka yang tidak mengharapkan lelucon dasar 8, dan 5 tipe orang lainnya.
Jon Story

42

Karena:

~$ echo $((NUM))
14

jika angka dimulai dengan 0, itu dianggap sebagai nilai oktal dan 16 dalam oktal adalah 14 dalam desimal.


2
Itu masuk akal dan menjelaskan mengapa skrip saya menimpa file lama saya :-(
DeltaLima
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.