Добавление 1 к переменной не работает должным образом (арифметика Bash)

16

Если я напишу следующее в терминал bash:

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

Я получаю 11, а не 13, как я ожидал !!!!!

У меня есть googled around, и я не могу объяснить это вообще, или выработать, как я могу увеличить число. (Я действительно хочу в конечном итоге с B = «0013» и каждый раз увеличивать каждый раз, когда я использую это как префикс для моих резервных копий)

    
задан Robert3452 11.09.2016 в 16:12
источник

3 ответа

28

Это потому, что числа, начинающиеся с 0 , рассматриваются как Octal на bash , поэтому он добавляет Octal (Base 8). Чтобы получить десятичное дополнение для этой структуры, вам нужно явно определить базу или вообще не использовать 00 .

Для десятичного значения Base - 10, обозначается 10# :

$ A="10#0012"
$ echo $((A+1))
13
    
ответ дан heemayl 11.09.2016 в 16:18
источник
5

Вы можете попробовать эту команду, чтобы получить ответ:

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

Более подробную информацию о команде bc можно найти здесь .

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.
    
ответ дан snoop 11.09.2016 в 16:20
2

Альтернативный метод может состоять в том, чтобы сохранить ваши переменные целыми числами и преобразовать их в строку в конце:

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

Этот стиль работы с целыми числами в математике и преобразование в строку для ответа более интуитивно для меня, поскольку я привык к программированию BASIC. Я понимаю, что у Bash нет переменных ввода, таких как C и BASIC, но притворяясь, что это делает меня счастливым.

    
ответ дан WinEunuuchs2Unix 11.09.2016 в 16:38