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)?


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

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
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.