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 estar lendo isso como uma string.
Lançamento da versão 4.2.45 (1) do Bash (x86_64-pc-linux-gnu) no Ubuntu 13.10.
((++var))
ou((var=var+1))
ou((var+=1))
.var=0; ((var++))
retorna um código de erro enquantovar=0; ((var++)); ((var++))
não. Alguma idéia do porquê?help '(('
. A última linha diz:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
é por isso que a dica de @ gniourf_gniourf inclui,((++var))
mas não((var++))
.let var++
sem as aspas?A aritmética no bash usa
$((...))
sintaxe.fonte
((...))
é a chave para o uso da aritmética na festança. Não percebi isso apenas olhando para a resposta aceita - pensei que havia um conjunto estranho de regras sobre a ordem das operações ou algo que levasse a todos os parênteses na resposta aceita.Análise de desempenho de várias opções
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, procure as outras respostas nesta pergunta.
Ter tantas opções leva a essas duas perguntas:
Código de teste de desempenho incremental:
Resultados:
Conclusão:
Parece que o bash tem o desempenho mais rápido
i+=1
quando$i
é declarado como um número inteiro.let
As declarações parecem particularmente lentas eexpr
são de longe as mais lentas, porque não são incorporadas.fonte
Há também isso:
Tome nota cuidadosa dos 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 para o bash. Eu sei que você perguntou especificamente sobre o bash, mas pensei em me aprofundar 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.
fonte
i=$((i+1))
$(...)
estiver disponível neste shell, eu recomendo usá-lo.Se você declarar
$var
como um número inteiro, o que você tentou na primeira vez funcionará:Referência: Tipos de variáveis, Guia Bash para Iniciantes
fonte
Falta um método em todas as respostas -
bc
bc
é especificado pelo padrão POSIX , portanto, deve estar presente em todas as versões dos sistemas compatíveis com Ubuntu e POSIX. O<<<
redirecionamento pode ser alterado para garantir aecho "$VAR" | bc
portabilidade, mas, como a pergunta é questionadabash
- não há problema em usar apenas<<<
.fonte
O código de retorno
1
questão está presente para todas as variantes padrão (let
,(())
, etc.). Isso geralmente causa problemas, por exemplo, em scripts usadosset -o errexit
. Aqui está o que estou usando para evitar código de erro1
de expressões matemáticas que avaliam0
;fonte
Essa deve ser a pior maneira de realizar uma tarefa tão simples, mas eu apenas queria documentá-la por diversão, eu acho (completamente o oposto do código golf).
ou
Use seriamente uma das outras opções muito melhores aqui.
fonte