Menambahkan 1 ke variabel tidak berfungsi seperti yang diharapkan (Bash arithmetic)

16

Jika saya menulis yang berikut ini ke terminal bash:

A="0012"
B=$((A+1))
echo $B

Saya mendapatkan 11, Tidak 13 seperti yang saya harapkan !!!!!

Saya sudah googled di sekitar dan saya tidak bisa menjelaskannya sama sekali, atau mencari tahu bagaimana saya bisa mendapatkan nomor yang bertambah. (Saya sebenarnya ingin berakhir dengan B = "0013" dan menambah satu setiap kali karena saya menggunakan ini sebagai awalan untuk cadangan saya)

Robert3452
sumber
2
Waspadalah terhadap nol di dasarnya bahasa apa pun yang berasal dari UNIX. Ini biasanya berarti oktal.
Joshua
Tidak, bukan, Anda mendapatkan 1011 biner
Ken Mollerup

Jawaban:

28

Itu karena angka yang diawali dengan 0diperlakukan sebagai Oktal oleh bash, maka ia melakukan penambahan Octal (Basis 8). Untuk mendapatkan tambahan desimal untuk struktur ini, Anda perlu mendefinisikan Basis secara eksplisit atau tidak menggunakan 00semuanya.

Untuk Desimal, Base adalah 10, dilambangkan dengan 10#:

$ A="10#0012"
$ echo $((A+1))
13
heemayl
sumber
5

Anda dapat mencoba perintah ini untuk mendapatkan jawabannya:

A="0012"
echo $A + 1 | bc

Informasi lebih lanjut tentang bcperintah dapat ditemukan di sini .

bc halaman manual:

NAME
       bc - An arbitrary precision calculator language

SYNTAX
       bc [ -hlwsqv ] [long-options] [  file ... ]

DESCRIPTION
       bc is a language that supports arbitrary precision numbers with interactive execution of statements.  There are some similarities
       in the syntax to the C programming language.  A standard math library is available by command line  option.   If  requested,  the
       math  library is defined before processing any files.  bc starts by processing code from all the files listed on the command line
       in the order listed.  After all files have been processed, bc reads from the standard input.  All code is executed as it is read.
       (If a file contains a command to halt the processor, bc will never read from the standard input.)

       This  version of bc contains several extensions beyond traditional bc implementations and the POSIX draft standard.  Command line
       options can cause these extensions to print a warning or to be rejected.  This document describes the language accepted  by  this
       processor.  Extensions will be identified as such.
mengintip
sumber
4
Alih-alih menggunakan echodan sebuah pipa, Anda bisa menggunakan sintaks Bash "di sini string". Efeknya sama, tetapi IMHO "di sini string" lebih indah: bc <<< "$A + 1":-)
Byte Commander
Pengantar satu atau dua kalimat dari bcperintah di samping heretautan akan sangat membantu.
WinEunuuchs2Unix
2

Metode alternatif mungkin untuk menjaga variabel Anda sebagai bilangan bulat dan mengubahnya menjadi string di akhir:

A=12
B=$((A+1))
echo $B
13
C=$( printf '%04d' $B )
echo $C
0013

Gaya ini bekerja dengan bilangan bulat dalam matematika dan mengkonversi ke string untuk jawabannya lebih intuitif bagi saya karena saya terbiasa dengan pemrograman BASIC. Saya menghargai Bash tidak memiliki variabel mengetik seperti C dan BASIC tetapi berpura-pura itu membuat saya bahagia.

WinEunuuchs2Unix
sumber
Ini adalah ujian untuk menyoroti masalah yang saya alami. Saya membaca variabel awal dengan mengambil output dari perintah lain yang merupakan teks dan memiliki nol di depan.
Robert3452
Ah ... sejarah selalu menjelaskan bagaimana kita sampai sekarang.
WinEunuuchs2Unix
@ Robert3452 Anda juga bisa menghapus angka nol di depan:A="0012"; A=$((10#$A))
wjandrea