Al incrementar previamente/posteriormente una variable, en POSIX Shell, ¿cuál es la diferencia entre estos dos ejemplos? Parece que tendrían las mismas consecuencias, pero ¿se usarían de manera diferente? ¿Cuándo preferirías uno sobre el otro?
X=$((X+1))
: $((X=X+1))
Respuesta1
En su primer ejemplo, $((X+1))
evalúa la expresión X + 1 y la expande hasta el resultado, que luego se asigna a la variable.
En el segundo ejemplo, $((X=X+1))
se incrementa X
en uno ( $((X++))
también es válido y más corto, pero no necesariamente compatible con el shell) y luego se expande al nuevo valor de $X
, que es el primer argumento del comando nulo :
. El comando nulo ignora sus argumentos y el resultado se descarta (con efectos secundarios).
Personalmente preferiría la primera forma por tres razones (relativamente subjetivas):
- El comando nulo es oscuro e incomprendido, como lo indica el hecho de que a menudo sea objeto de preguntas confusas aquí.
- La primera forma parece más natural en términos de gramática general del shell e incluso se parece un poco al antiguo estilo de evaluación.
- La primera forma es más clara y concisa y no implica una orden.
Tendrías que usar la primera versión si estuvieras modificando el entorno de un solo comando como
X=$((X+1)) /usr/local/bin/something
Tendrías que usar la segunda forma para agregar evaluación a los argumentos directamente:
ls -la "file-$((X++))" # or ...
ls -la "file-$((X=X+1))" # for better compatibility
Esto tiene los efectos secundarios deseados, ahorra una línea y es bastante claro.