Bir değişkene 1 eklemek beklendiği gibi çalışmaz (Bash aritmetiği)


16

Aşağıdakileri bir bash terminaline yazarsam:

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

Beklediğim gibi 11 değil, 13 olsun !!!!!

Etrafımda dolaştım ve hiç açıklayamıyorum ya da sayıyı nasıl artırabileceğimi çözemiyorum. (Aslında B = "0013" ile bitirmek ve her zaman bir yedekleme artırmak için öneki olarak kullanıyorum istiyorum)


2
UNIX kaynaklı herhangi bir dilde sıfırlara dikkat edin. Bu normalde sekizli anlamına gelir.
Joshua

Hayır sen 1011 ikili olsun
Ken Mollerup

Yanıtlar:


28

Bunun nedeni, ile başlayan sayılara 0Octal tarafından muamele edilmesidir bash, bu nedenle Octal (Base 8) ilavesi yapıyor. Bu yapı için Ondalık ekleme elde etmek için, Tabanı açıkça tanımlamanız veya 00tamamen kullanmamanız gerekir .

Ondalık için, Taban 10'dur 10#:

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

5

Cevabı almak için bu komutu deneyebilirsiniz:

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

bcKomut hakkında daha fazla bilgiyi burada bulabilirsiniz .

bc man sayfası:

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.

4
echoBir boru kullanmak yerine Bash'in "here string" sözdizimini kullanabilirsiniz. Etkisi aynı, ama IMHO "burada dize" daha güzel: bc <<< "$A + 1":-)
Byte Komutanı

Bir bağlantıya bcek olarak komutun bir veya iki cümle girişi herede yardımcı olacaktır.
WinEunuuchs2Unix

2

Alternatif bir yöntem, değişkenlerinizi tamsayı olarak tutmak ve sonunda bir dizeye dönüştürmek olabilir:

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

Matematikte tamsayılarla çalışma ve cevap için dizeye dönüştürme tarzı, BASIC programlamaya alışkın olduğum için bana daha sezgisel. Bash'in C ve BASIC gibi değişken yazımları olmadığını takdir ediyorum, ancak bunu yapmak beni mutlu ediyor.


Bu yaşadığım sorunu vurgulamak için yapılan bir testti. Metin ve önde gelen sıfırları olan bir komutun çıktısını alarak ilk değişkeni okudum.
Robert3452

Ah ... tarih her zaman bugüne nasıl geldiğimizi açıklar.
WinEunuuchs2Unix

@ Robert3452 Ayrıca önde gelen sıfırları da çıkarabilirsiniz:A="0012"; A=$((10#$A))
wjandrea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.