Tại sao bash nghĩ: 016 + 1 = 15?


60

Ai đó có thể giải thích cho tôi tại sao một số có số 0 đứng đầu đưa ra hành vi hài hước này không?

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

Sẽ in:

016 + 1 = 15


3
Psst: printf "%03d\n" 10hoàn toàn có thể sử dụng trong bash để có được số 0 đứng đầu cho tên tệp và như vậy.
Bóp

@Squeezy Cảm ơn, nhưng phần đó đã hoạt động. Vấn đề thực tế là không có được tên tệp với số 0. Nó đang tìm ra tên tệp nào có số cao nhất và sau đó tạo chuỗi tiếp theo, bằng cách sử dụng printf "prefix-% 03d.tif" $ SUM.
DeltaLima

8
Lưu ý rằng bạn có thể tự mình tìm ra điều này chỉ bằng cách thực hiệnecho $((016))
Mehrdad

2
FYI, điều này đúng trong nhiều ngôn ngữ lập trình: C, C ++, Javascript.
Paul Draper

Câu trả lời:


128

Sự hiểu lầm là những con số không có nghĩa là những gì bạn mong đợi.

Số 0 đứng đầu biểu thị một số có cơ sở 8. Tức 016là giống như 8#16. Nếu bạn muốn giữ số 0 đứng đầu thì bạn cần 10#016.

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

23
Có 10 loại người trên thế giới. Những người hiểu nhị phân, những người không, những người không mong đợi một trò đùa cơ bản 8 và 5 loại người khác.
Câu chuyện Jon

42

Bởi vì:

~$ echo $((NUM))
14

nếu số bắt đầu bằng 0, nó được coi là giá trị bát phân và 16 trong số bát phân là 14 trong số thập phân.


2
Điều đó hoàn toàn hợp lý và giải thích lý do tại sao tập lệnh của tôi ghi đè lên các tệp cũ của tôi :-(
DeltaLima
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.