J'ai essayé d'incrémenter une variable numérique en utilisant les deux var=$var+1
et var=($var+1)
sans succès. La variable est un nombre, bien que bash semble la lire sous forme de chaîne.
Bash version 4.2.45 (1) -release (x86_64-pc-linux-gnu) sur Ubuntu 13.10.
((++var))
ou((var=var+1))
ou((var+=1))
.var=0; ((var++))
retourne un code d'erreur alors que cevar=0; ((var++)); ((var++))
n'est pas le cas. Une idée pourquoi?help '(('
. La dernière ligne dit:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
c’est pourquoi le pourboire de @ gniourf_gniourf inclut,((++var))
mais pas((var++))
.let var++
, sans les guillemets?L'arithmétique en bash utilise la
$((...))
syntaxe.la source
((...))
est essentiel d’utiliser l’arithmétique. en bash. Je ne savais pas que, juste en regardant la réponse acceptée - je pensais qu'il y avait un ensemble étrange de règles concernant l'ordre des opérations ou quelque chose qui conduisait à toutes les parenthèses dans la réponse acceptée.Analyse de performance des différentes options
Merci à la réponse de Radu Rădeanu qui fournit les moyens suivants pour incrémenter une variable dans bash:
Il y a aussi d'autres moyens. Par exemple, regardez dans les autres réponses à cette question.
Avoir autant d'options conduit à ces deux questions:
Code de test de performance incrémentiel:
Résultats:
Conclusion:
Il semble que bash soit le plus rapide à exécuter
i+=1
quand$i
est déclaré comme un entier.let
les déclarations semblent particulièrement lentes etexpr
sont de loin les plus lentes car elles ne sont pas intégrées.la source
Il y a aussi ceci:
Prenez note des espaces et notez que « is not »
Bien que les réponses et les commentaires de Radu soient exhaustifs et très utiles, ils sont spécifiques à chaque bash. Je sais que vous avez spécifiquement posé des questions sur bash, mais je pensais vous adresser à la question car je trouvais cette question lorsque je cherchais à faire la même chose en utilisant sh dans busybox sous uCLinux. Ce portable au-delà de bash.
la source
i=$((i+1))
$(...)
est disponible sur ce shell, je vous recommanderais plutôt de l’utiliser.Si vous déclarez
$var
un entier, alors ce que vous avez essayé la première fois fonctionnera réellement:Référence: Types de variables, Guide Bash pour les débutants
la source
Il manque une méthode dans toutes les réponses -
bc
bc
est spécifié par le standard POSIX , il devrait donc être présent sur toutes les versions de systèmes compatibles Ubuntu et POSIX. La<<<
redirection pourrait être modifiée pourecho "$VAR" | bc
des raisons de portabilité, mais puisque la question vous pose une question, vous pouvezbash
simplement l'utiliser<<<
.la source
Le code de retour
1
problème est présent pour toutes les variantes par défaut (let
,(())
, etc.). Cela cause souvent des problèmes, par exemple, dans les scripts qui utilisentset -o errexit
. Voici ce que j'utilise pour empêcher le code d'erreur1
des expressions mathématiques évaluées à0
;la source
Cela doit être le pire moyen d'accomplir une tâche aussi simple, mais je voulais juste la documenter pour le plaisir, je suppose (c'est le contraire du code golf).
ou
Sérieusement, utilisez l'un des autres choix bien meilleurs ici.
la source