Tại sao bash nghĩ rằng 010 là 8?


17

Tại sao bash nghĩ số 010 = 8?

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

Tôi nghĩ rằng nó có thể là nhị phân, nhưng 010 = 10 = 2. Vậy tại sao nó nhận được 8, và làm thế nào tôi có thể khiến nó nghĩ 010 = 10 (và 010 - 2 = 8)?


15
Dẫn đầu 0nói nó là bát phân. Nếu bạn chỉ làm x=10rồi echo $((x+0))sau đó chương trình 10. Ngoài ra, không cần thêm $cho trong ().
Terrance

2
Trong nhiều trình phân tích số, 010có nghĩa là 8 bởi vì đặt 0phía trước có nghĩa là bát phân, tương tự như cách đặt 0xtrong một số ngôn ngữ có nghĩa là hex.
Derek 朕 會

9
Đây thực sự là một điều quan trọng cần biết khi lập trình. Trong hầu hết các ngôn ngữ 0kích hoạt bát phân, 0xhex và 0bnhị phân.
Seth

Downvote giải thích?
Tim

3
@tim tại sao nó lại - không phải là 8? ;-) Oh không phải downvote của tôi nhưng có lẽ vì nó quá cơ bản. Đó là hành vi khá bình thường.
Rinzwind

Câu trả lời:


42

Chuỗi số bắt đầu bằng a 0được hiểu là số bát phân.
Octal 10= thập phân 8.

Để có được bash để coi nó là số thập phân, hãy xóa số 0 hoặc số thập phân hàng đầu bằng:

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

Nói chung, nó hoạt động cho tất cả các cơ sở, chỉ cần thay thế 10bằng cơ sở mà bạn muốn:

N=[base#]n

Chỉnh sửa câu hỏi với hai cách để giải quyết nó.
Pabi

1
@Tim để làm điều đó, bạn có thể sử dụng $ {N%?} Để cắt chữ số cuối cùng và sau đó $ {N: -} để thay thế trống bằng 0.
Random832

@Tim nếu vậy tôi không thể tìm ra làm thế nào. $ {$ {N%?}: - 0} hoạt động trong zsh nhưng không hoạt động trong bash hoặc ksh. (Ngoài ra, :-trong nhận xét của tôi ở trên nên có :-0}
Random832

Bạn nên đưa vào câu trả lời của mình rằng bạn có thể buộc bất kỳ cơ sở nào có " biểu mẫu [cơ sở #] n, trong đó cơ sở là số thập phân từ 2 đến 64 đại diện cho cơ sở số học và n là một số trong cơ sở đó " : bash ref
djeikyb
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.