Pertanyaan Mengapa bash berpikir bahwa 010 adalah 8?


Mengapa bash memikirkan angka 010 = 8?

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

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


17
2018-05-09 13:17


asal


Terkemuka 0 mengatakan itu menjadi oktal. Jika Anda baru saja melakukannya x=10 kemudian echo $((x+0)) lalu muncul 10. Juga, tidak perlu tambahan $ dalam (). - Terrance
Di banyak parser, 010 Berarti 8 karena dengan menempatkan 0 di depan berarti oktal, mirip dengan cara meletakkan 0x dalam beberapa bahasa berarti hex. - Derek 朕會功夫
Ini sebenarnya merupakan hal yang penting untuk diketahui saat pemrograman. Di sebagian besar bahasa 0 memicu oktal, 0x hex dan 0b biner. - Seth♦
Penjelasan downvote? - Tim
@tim mengapa itu tidak bisa menjadi 8? ;-) Oh bukan downvote saya tapi mungkin karena terlalu dasar. Ini perilaku yang sangat normal. - Rinzwind


Jawaban:


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

Untuk mendapatkan bash untuk memperlakukannya sebagai angka desimal, hapus nol atau desimal gaya dorong dengan:

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

Umumnya yang berfungsi untuk semua basis, ganti saja 10 dengan basis yang Anda inginkan:

N=[base#]n

42
2018-05-09 13:19



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