Respuestas:
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 X
en 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):
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.