2015-08-13 12 views
6

Khi cố gắng thực thi một tập lệnh bash đơn giản để tăng số bằng 0 trước 1, số gốc được diễn giải sai.

#!/bin/bash 
number=0026 
echo $number 
echo $((number)) 
echo $((number+1)) 

Khi lệnh này được thực thi tôi nhận được kết quả:

0026 
22 
23 

Tại sao điều này xảy ra?

+10

hàng đầu '0' có nghĩa là nó là một số bát phân, bát phân (26) = số thập phân (22) –

+0

sử dụng printf vs echo sẽ giúp bạn phát hiện ra điều này dễ dàng hơn - printf "% d" 0026 –

Trả lời

4

Buộc cơ số 10 đại diện:

$ echo $((10#$number)) 
26 
$ echo $((10#$number + 1)) 
27 

Hưởng ứng lời nhận xét Kojiro của:

$ something=08 
$ echo $((something)) 
bash: 08: value too great for base (error token is "08") 
$ echo $(($something)) 
bash: 08: value too great for base (error token is "08") 
$ echo $((10#something)) 
bash: 10#something: value too great for base (error token is "10#something") 
$ echo $((10#$something)) 
8 
$ echo $((08)) 
bash: 08: value too great for base (error token is "08") 
$ echo $((10#08)) 
8 

$ echo $((16#10)) 
16 
$ echo $((16#f)) 
15 
$ echo $((16#10 - 1)) 
15 
+0

Đó là một cái mới cho tôi. Cảm ơn, Glenn! :) – ghoti

+0

Tôi nghĩ rằng tuyên bố này là một chút bối rối, thực sự. 'echo $ ((cái gì đó))' sẽ * luôn * cho đại diện base-10. Biểu thức "radix # repr" cung cấp cho bạn là kiểm soát _interpretation_ của việc mở rộng. 'echo $ ((16 # 10))' không in ra "f", mà sẽ là cơ sở-16 _representation_ của số đó; nó in ra "10", là cơ sở-10 _representation_ của số đã cho được hiểu là base-16. – kojiro

+0

@kojiro, cái gì? Tôi đã cung cấp một số ví dụ ở trên. Biểu thức '16 # 10' là giá trị thập phân 16:' echo $ ((16 # 10 - 1)) 'kết quả đầu ra 15 –

Các vấn đề liên quan