Eu tentei incrementar uma variável numérica usando ambos var=$var+1
e var=($var+1)
sem sucesso. A variável é um número, embora o bash pareça lê-lo como uma string.
Bash versão 4.2.45(1)-release (x86_64-pc-linux-gnu) no Ubuntu 13.10.
Eu tentei incrementar uma variável numérica usando ambos var=$var+1
e var=($var+1)
sem sucesso. A variável é um número, embora o bash pareça lê-lo como uma string.
Bash versão 4.2.45(1)-release (x86_64-pc-linux-gnu) no Ubuntu 13.10.
Há mais de uma maneira de incrementar uma variável em
bash
, mas o que você tentou não funcionará.Você pode usar, por exemplo, expansão aritmética :
Ou você pode usar
let
:Veja também: https://tldp.org/LDP/abs/html/dblparens.html .
A aritmética no bash usa
$((...))
sintaxe.Várias opções para incrementar em 1 e análise de desempenho
Graças à resposta de Radu Rădeanu, que fornece as seguintes maneiras de incrementar uma variável no bash:
Existem outras maneiras também. Por exemplo, veja as outras respostas sobre esta pergunta.
Ter tantas opções leva a estas duas perguntas:
Código de teste de desempenho incremental:
Resultados:
Conclusão:
Parece que o bash é mais rápido no desempenho
i+=1
quando$i
é declarado como um número inteiro.let
declarações parecem particularmente lentas, eexpr
é de longe a mais lenta porque não é um bash embutido.Também tem isso:
Observe atentamente os espaços e também ' não é '
Embora as respostas de Radu e os comentários sejam exaustivos e muito úteis, eles são específicos do bash. Eu sei que você perguntou especificamente sobre o bash, mas pensei em entrar desde que encontrei essa pergunta quando estava procurando fazer a mesma coisa usando sh no busybox no uCLinux. Este portátil além do bash.
Se você declarar
$var
como um inteiro, o que você tentou na primeira vez realmente funcionará:Referência: Tipos de variáveis, Guia Bash para Iniciantes
Há um método faltando em todas as respostas -
bc
bc
é especificado pelo padrão POSIX , portanto, deve estar presente em todas as versões do Ubuntu e sistemas compatíveis com POSIX. O<<<
redirecionamento pode ser alteradoecho "$VAR" | bc
para portabilidade, mas como a pergunta perguntabash
- não há problema em usar apenas<<<
.O problema do código de retorno
1
está presente para todas as variantes padrão (let
,(())
, etc.). Isso geralmente causa problemas, por exemplo, em scripts que usamset -o errexit
. Aqui está o que estou usando para evitar o código1
de erro de expressões matemáticas que são avaliadas como0
;Esta deve ser a pior maneira de realizar uma tarefa tão simples, mas eu só queria documentá-la por diversão, eu acho (completamente o oposto do código de golfe).
ou
Use seriamente uma das outras opções muito melhores aqui.
Esta é a aposta segura
Se o valor resultante for diferente de zero, então definir exit on error irá parar Seu script