Eu tenho um arquivo no nome de Build.number com o valor de conteúdo 012 que preciso incrementar em +1. Então, eu tentei isso
BN=$($cat Build.number)
BN=$(($BN+1))
echo $BN >Build.number
mas aqui estou recebendo o valor 11 quando estou esperando 013 . Alguém pode me ajudar?
O 0 inicial faz com que o Bash interprete o valor como um valor octal ; 012 octal é 10 decimal, então você obtém 11.
Para forçar o uso de decimal, adicione
10#
(desde que o número não tenha sinal inicial):Para imprimir o número usando pelo menos três dígitos, use
printf
:bash
trata constantes que começam com0
números octais em suas expressões aritméticas, então011
na verdade é9
.Isso é realmente um requisito POSIX.
Alguns outros shells gostam
mksh
ouzsh
ignoram (a menos que no modo compatível com POSIX), pois atrapalha muito mais do que é útil.Com
ksh93
,BN=011; echo "$(($BN))"
saídas9
, masecho "$((BN))"
saídas 11.Em
bash
, você pode usarBN=$((10#$(<Build.number)))
, que deve funcionar desde que o número não comece com-
ou+
.Em qualquer shell POSIX, você pode evitar que um número seja considerado octal removendo seus zeros à esquerda com uma combinação das formas de expansão
${var#prefix}
e :${var%%suffix}
Em shells que suportam a
${var//pat/repl}
sintaxe, você também pode fazer isso adicionando a1
e subtraindo-o de10^{number_of_digits}
:Isso funciona em
bash
,zsh
,ksh93
e .mksh
yash
Em
bash
,ksh93
andzsh
(mas não emyash
andmksh
) você também pode usar o operador fortranish**
(exponenciação):Aqui está uma função para incrementar uma string numérica. Ele observa zeros à esquerda e tenta preservar o número de dígitos. Ele não usa variáveis, portanto, não requer nenhuma extensão de shell para declarar variáveis locais e não polui o namespace da variável:
Testes interativos: