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

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

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 Xen 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.

información relacionada