He intentado incrementar una variable numérica usando ambos var=$var+1
y var=($var+1)
sin éxito. La variable es un número, aunque bash parece estar leyéndolo como una cadena.
Bash versión 4.2.45 (1) -release (x86_64-pc-linux-gnu) en Ubuntu 13.10.
Hay más de una forma de incrementar una variable en bash, pero lo que intentó no es correcto.
Puede usar, por ejemplo, la expansión aritmética :
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
O puedes usar let
:
let "var=var+1"
let "var+=1"
let "var++"
Ver también: http://tldp.org/LDP/abs/html/dblparens.html .
((++var))
o((var=var+1))
o((var+=1))
.var=0; ((var++))
devuelve un código de error mientrasvar=0; ((var++)); ((var++))
que no. ¿Alguna idea de por qué?help '(('
. La última línea dice:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
es la razón por la cual la sugerencia de @ gniourf_gniourf incluye((++var))
pero no((var++))
.let var++
, sin las comillas?La aritmética en bash usa la
$((...))
sintaxis.fuente
((...))
es la clave para usar la aritmética en fiesta No me di cuenta de que solo mirando la respuesta aceptada, pensé que había un conjunto extraño de reglas sobre el orden de las operaciones o algo que condujera a todos los paréntesis en la respuesta aceptada.Análisis de rendimiento de varias opciones.
Gracias a la respuesta de Radu Rădeanu que proporciona las siguientes formas de incrementar una variable en bash:
También hay otras formas. Por ejemplo, mira las otras respuestas sobre esta pregunta.
Tener tantas opciones lleva a estas dos preguntas:
Código de prueba de rendimiento incremental:
Resultados:
Conclusión:
Parece que bash es más rápido
i+=1
cuando$i
se declara como un entero.let
Las declaraciones parecen particularmente lentas, yexpr
es, con mucho, la más lenta porque no está integrada.fuente
También hay esto:
Tome nota de los espacios y también ' no es '
Si bien las respuestas de Radu y los comentarios son exhaustivos y muy útiles, son específicos de bash. Sé que preguntaste específicamente sobre bash, pero pensé en hablar desde que encontré esta pregunta cuando estaba buscando hacer lo mismo usando sh en busybox en uCLinux. Este portátil más allá de bash.
fuente
i=$((i+1))
$(...)
está disponible en este shell, recomendaría usarlo en su lugar.Si declaras
$var
como un entero, lo que intentaste la primera vez realmente funcionará:Referencia: Tipos de variables, Guía Bash para principiantes
fuente
Falta un método en todas las respuestas:
bc
bc
está especificado por el estándar POSIX , por lo que debe estar presente en todas las versiones de Ubuntu y sistemas compatibles con POSIX. La<<<
redirección podría modificarseecho "$VAR" | bc
para la portabilidad, pero dado que la pregunta se refiere abash
: está bien usarla<<<
.fuente
El código de retorno
1
tema está presente para todas las variantes (por defectolet
,(())
, etc.). Esto a menudo causa problemas, por ejemplo, en los scripts que usanset -o errexit
. Esto es lo que estoy usando para evitar que el código de error1
de las expresiones matemáticas evalúen0
;fuente
Esta tiene que ser la peor manera de lograr una tarea tan simple, pero supongo que solo quería documentarlo por diversión (completamente opuesto al código golf).
o
En serio, use una de las otras opciones mucho mejores aquí.
fuente