Agregar 1 a una variable no funciona como se esperaba (Bash arithmetic)

16

Si escribo lo siguiente en un terminal de bash:

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

¡Tengo 11, no 13 como esperaba!

He buscado en Google y no puedo explicarlo en absoluto, o averiguar cómo puedo aumentar el número. (De hecho, quiero terminar con B="0013" e incrementar uno cada vez, ya que estoy usando esto como el prefijo de mis copias de seguridad)

    
pregunta Robert3452 11.09.2016 - 14:12

3 respuestas

28

Eso se debe a que los números que comienzan con 0 se tratan como Octal por bash , por lo tanto, están haciendo Octal (Base 8) además. Para obtener una adición decimal para esta estructura, necesita definir explícitamente la base o no usar 00 en total.

Para Decimal, la Base es 10, denotada por 10# :

$ A="10#0012"
$ echo $((A+1))
13
    
respondido por el heemayl 11.09.2016 - 14:18
5

Puedes probar este comando para obtener la respuesta:

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

Se puede encontrar más información sobre el comando bc aquí .

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.
    
respondido por el snoop 11.09.2016 - 14:20
2

Un método alternativo puede ser mantener sus variables como enteros y convertirlas a una cadena al final:

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

Este estilo de trabajo con números enteros en matemáticas y la conversión a cadenas para la respuesta es más intuitivo para mí, ya que estoy acostumbrado a la programación BASIC. Aprecio que Bash no tenga mecanografía variable como C y BASIC pero pretender que me hace feliz.

    
respondido por el WinEunuuchs2Unix 11.09.2016 - 14:38

Lea otras preguntas en las etiquetas