Un par de comandos relacionados con la aritmética, Dash, shell POSIX, sh, Incremento

17

Cuando se incrementa una variable antes / después, en POSIX Shell, ¿cuál es la diferencia entre estos dos ejemplos? Parecen 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))
JM Becker
fuente

Respuestas:

18

En su primer ejemplo, $((X+1))evalúa la expresión X + 1 y se expande al resultado, que luego se asigna a la variable.

En el segundo ejemplo, $((X=X+1))incrementos Xen uno ( $((X++))también es válido y más corto, pero no necesariamente con el apoyo de la cáscara), a continuación, se expande para el nuevo valor de $X, que es el primer argumento en el comando nulo, :. El comando nulo ignora sus argumentos y el resultado se descarta (con efectos secundarios).

Personalmente, preferiría la primera forma debido a tres razones (relativamente subjetivas):

  • El comando nulo es oscuro e incomprendido, como se indica porque a menudo es 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 más concisa y no implica un comando.

Tendrías que usar la primera versión si modificaras el entorno de un solo comando como

X=$((X+1)) /usr/local/bin/something

Tendría que usar el segundo formulario para agregar una 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, guarda una línea y es bastante claro.

Alexios
fuente