Como incrementar uma variável em bash?
Tentei incrementar uma variável numérica utilizando tanto var=$var+1
como var=($var+1)
sem sucesso. A variável é um número, embora a bash pareça estar a lê-la como uma string.
Bash version 4.2.45(1)-release (x86_64-pc-linux-gnu) on Ubuntu 13.10.
623
8
Há mais de uma forma de incrementar uma variável em bash, mas o que se tentou não é correcto.
Pode usar por exemplo **expansão aritmética***:
Ou pode usar
let
**:Ver também: http://tldp.org/LDP/abs/html/dblparens.html.
Aritmética em bash utiliza
$((...))
sintaxe.Análise de desempenho de várias opções
Graças ao [Radu Rădeanu's answer][1] que fornece as seguintes formas de incrementar uma variável em bash:
Também há outras maneiras. Por exemplo, veja nas outras respostas a esta pergunta.
Ter tantas opções leva a estas duas questões:
Se sim, qual delas tem melhor desempenho?
Código de teste de performance Incremental:
Resultados:
Conclusão:
Parece que o bash é mais rápido a executar
i+=1
quando$i
é declarado como um número inteiro. As declaraçõeslet' parecem particularmente lentas, e
expr' é de longe a mais lenta porque não é uma construção.[1]: https://askubuntu.com/a/385532/301745
Aí's também isto:
Tome nota cuidadosamente dos espaços e também **`* não é '**
Embora as respostas de Radu's, e os comentários, sejam exaustivos e muito úteis, são específicos. Eu sei que perguntou especificamente sobre bash, mas pensei em I'd cachimbo de entrada desde que encontrei esta pergunta quando procurava fazer a mesma coisa usando sh in busybox sob uCLinux. Isto é portátil para além da bash.
Se você declarar
$var
como um número inteiro, então o que você tentou da primeira vez irá realmente funcionar:Referência: Tipos de variáveis, Bash Guide for Beginners
Ali'falta um método em todas as respostas -
bc
O código de retorno
1
está presente para todas as variantes padrão (let
,(())
, etc.). Isso geralmente causa problemas, por exemplo, em scripts que utilizamset -o errexit
. Aqui está o que eu estou utilizando para evitar que o código de erro1
seja usado em expressões matemáticas que avaliam para0
;Esta tem que ser a pior maneira de realizar uma tarefa tão simples, mas eu só queria documentá-la por diversão, eu acho (o o oposto completo do código de golfe).
ou
A sério, usa uma das outras escolhas muito melhores aqui.