AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 545909
Accepted
Naik
Naik
Asked: 2019-10-10 04:44:09 +0800 CST2019-10-10 04:44:09 +0800 CST 2019-10-10 04:44:09 +0800 CST

Como incrementar o valor de uma variável (decimal) (com zero à esquerda) em +1?

  • 772

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?

bash
  • 4 4 respostas
  • 3538 Views

4 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2019-10-10T04:49:18+08:002019-10-10T04:49:18+08:00

    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):

    BN=10#$(cat Build.number)
    echo $((++BN)) > Build.number
    

    Para imprimir o número usando pelo menos três dígitos, use printf:

    printf "%.3d\n" $((++BN)) > Build.number
    
    • 32
  2. Stéphane Chazelas
    2019-10-10T04:59:16+08:002019-10-10T04:59:16+08:00

    bashtrata constantes que começam com 0números octais em suas expressões aritméticas, então 011na verdade é 9.

    Isso é realmente um requisito POSIX.

    Alguns outros shells gostam mkshou zshignoram (a menos que no modo compatível com POSIX), pois atrapalha muito mais do que é útil.

    Com ksh93, BN=011; echo "$(($BN))"saídas 9, mas echo "$((BN))"saídas 11.

    Em bash, você pode usar BN=$((10#$(<Build.number))), que deve funcionar desde que o número não comece com -ou +.

    • 18
  3. mosvy
    2019-10-11T01:42:01+08:002019-10-11T01:42:01+08:00

    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}

    BN=001002; BN=$(( ${BN#${BN%%[!0]*}} + 1 )); echo "$BN"
    1003
    

    Em shells que suportam a ${var//pat/repl}sintaxe, você também pode fazer isso adicionando a 1e subtraindo-o de 10^{number_of_digits}:

    BN=000012; BN=$(( 1$BN - 1${BN//?/0} )); echo "$BN"; BN=$((BN+1)); echo "$BN"
    12
    13
    

    Isso funciona em bash, zsh, ksh93e .mkshyash

    Em bash, ksh93and zsh(mas não em yashand mksh) você também pode usar o operador fortranish **(exponenciação):

    BN=000012; BN=$(( 1$BN - 10**${#BN} ))
    
    • 4
  4. Kaz
    2019-10-13T12:49:14+08:002019-10-13T12:49:14+08:00

    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:

    # $1 -- decimal string, possibly with leading zeros or sign
    # $2 -- integer increment, no leading zeros.
    incnumstr()
    {
      if [ $1 -lt 0 ] ; then
        set -- $(incnumstr ${1#-} $((- $2)))
        [ $1 -le 0 ] && printf "%s" ${1#-}  \
                     || printf "%s" -$1
        return
      fi
    
      set -- ${1#-} $2 # strip leading minus from zero
    
      [ $1 -eq 0 ] && printf "%s%0.*d" "$3" ${#1} $2 \
                   || printf "%s%0.*d" "$3" ${#1} $(( ${1#${1%%[1-9]*}} + $2 ))
    }
    

    Testes interativos:

    $ echo $(incnumstr 0 0)
    0
    $ echo $(incnumstr -0 0)
    0
    $ echo $(incnumstr 0 1)
    1
    $ echo $(incnumstr 0 -1)
    -1
    $ echo $(incnumstr 00 1)
    01
    $ echo $(incnumstr 00 -1)
    -01
    $ echo $(incnumstr -10 10)
    00
    $ echo $(incnumstr -10 11)
    01
    $ echo $(incnumstr -10 20)
    10
    $ echo $(incnumstr -10 99)
    89
    $ echo $(incnumstr -10 110)
    100
    $ echo $(incnumstr 100 -90)
    010
    $ echo $(incnumstr 100 -99)
    001
    $ echo $(incnumstr 100 -100)
    000
    $ echo $(incnumstr 100 -101)
    -001
    $ echo $(incnumstr 100 -1234)
    -1134
    $ echo $(incnumstr -0000 0)
    0000
    $ echo $(incnumstr -0000 1)
    0001
    $ echo $(incnumstr -0000 -2)
    -0002
    
    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve