L'aggiunta di 1 a una variabile non funziona come previsto (aritmetica di Bash)

16

Se scrivo quanto segue in un terminale bash:

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

Ottengo 11, non 13 come mi aspettavo !!!!!

Ho cercato su google e non riesco a spiegarlo affatto, o non so come aumentare il numero. (In realtà vorrei finire con B="0013" e incrementare una volta ogni volta che sto usando questo come prefisso ai miei backup)

    
posta Robert3452 11.09.2016 - 16:12

3 risposte

28

Questo perché i numeri che iniziano con 0 sono trattati come Ottale di bash , quindi sta facendo l'aggiunta di Octal (Base 8). Per ottenere l'aggiunta Decimale per questa struttura, devi definire esplicitamente la Base o non utilizzare 00 del tutto.

Per decimale, la base è 10, denotata da 10# :

$ A="10#0012"
$ echo $((A+1))
13
    
risposta data heemayl 11.09.2016 - 16:18
5

Puoi provare questo comando per ottenere la risposta:

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

È possibile trovare ulteriori informazioni sul comando bc qui .

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.
    
risposta data snoop 11.09.2016 - 16:20
2

Un metodo alternativo può essere quello di mantenere le variabili come numeri interi e convertirli in una stringa alla fine:

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

Questo stile di lavoro con i numeri interi in matematica e la conversione in stringa per la risposta è più intuitivo per me, dato che sono abituato alla programmazione BASIC. Apprezzo che Bash non abbia una digitazione variabile come C e BASIC ma fingere che ciò mi renda felice.

    
risposta data WinEunuuchs2Unix 11.09.2016 - 16:38

Leggi altre domande sui tag