Mengapa bash berpikir bahwa 010 adalah 8?

17

Mengapa bash berpikir angka 010 = 8?

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

Saya pikir itu mungkin biner, tetapi 010 = 10 = 2. Jadi mengapa ia mendapatkan 8, dan bagaimana saya bisa membuatnya berpikir 010 = 10 (dan 010 - 2 = 8)?

Tim
sumber
15
Pemimpin 0mengatakan itu oktal. Jika Anda hanya melakukan x=10itu echo $((x+0))kemudian menunjukkan 10. Juga, tidak perlu untuk tambahan $dengan di ().
Terrance
2
Dalam banyak angka parser, 010berarti 8 karena dengan meletakkan 0di depan berarti oktal, mirip dengan bagaimana menempatkan 0xdalam beberapa bahasa berarti hex.
Derek 朕 會 功夫
9
Ini sebenarnya hal penting untuk diketahui saat pemrograman. Di sebagian besar bahasa, 0pemicu oktal, 0xhex , dan 0bbiner.
Seth
Turunkan penjelasan?
Tim
3
@ kadang kenapa -tidak- 8? ;-) Oh bukan downvote saya tapi mungkin karena itu terlalu mendasar. Itu perilaku yang cukup normal.
Rinzwind

Jawaban:

42

Urutan angka 0yang dimulai dengan a ditafsirkan sebagai angka oktal.
Oktal 10= desimal 8.

Untuk mendapatkan bash untuk memperlakukannya sebagai angka desimal, hapus nol di depan atau desimal paksa dengan:

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

Umumnya yang bekerja untuk semua pangkalan, cukup ganti 10dengan pangkalan yang Anda inginkan:

N=[base#]n
Pabi
sumber
Mengedit pertanyaan dengan dua cara untuk menyelesaikannya.
Pabi
1
@Tim untuk melakukannya, Anda dapat menggunakan $ {N%?} Untuk memotong digit terakhir dan kemudian $ {N: -} untuk mengganti kosong dengan 0.
Random832
@Tim kalau begitu aku tidak tahu caranya. $ {$ {N%?}: - 0} bekerja di zsh tetapi tidak di bash atau ksh. (Juga, :-dalam komentar saya di atas seharusnya :-0}
Random832
Anda harus memasukkan dalam jawaban Anda bahwa Anda dapat memaksa pangkalan apa pun dengan " form [base #] n, di mana basis adalah angka desimal antara 2 dan 64 yang mewakili basis aritmatika, dan n adalah angka di pangkalan itu " sumber: bash ref
djeikyb