Adicionar 1 a uma variável não funciona como esperado (Bash arithmetic)

16

Se eu escrever o seguinte em um terminal bash:

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

Recebo 11, não 13 como esperava !!!!!

Eu pesquisei e não consigo explicar nada, ou sei como posso aumentar o número. (Eu realmente quero acabar com B="0013" e incremento de cada vez que eu estou usando isso como o prefixo para meus backups)

    
por Robert3452 11.09.2016 / 16:12

3 respostas

28

Isso porque os números que começam com 0 são tratados como Octal por bash , portanto, está fazendo a adição Octal (Base 8). Para obter uma adição Decimal para essa estrutura, você precisa definir explicitamente a Base ou não usar 00 ao mesmo tempo.

Para decimal, a base é 10, denotada por 10# :

$ A="10#0012"
$ echo $((A+1))
13
    
por heemayl 11.09.2016 / 16:18
5

Você pode tentar este comando para obter a resposta:

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

Mais informações sobre o comando bc podem ser encontradas aqui .

bc man page:

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.
    
por snoop 11.09.2016 / 16:20
2

Um método alternativo pode ser manter suas variáveis como inteiros e convertê-los em uma string no final:

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

Esse estilo de trabalhar com números inteiros em matemática e converter em string para a resposta é mais intuitivo para mim, já que estou acostumado com a programação BASIC. Eu aprecio que o Bash não tem tipagem variável como C e BASIC, mas fingir que me faz feliz.

    
por WinEunuuchs2Unix 11.09.2016 / 16:38

Tags