A couple arithmetic related commands, Dash, POSIX shell, sh, Increment

13,112

In your first example, $((X+1)) evaluates the expression X + 1 and expands to the result, which is then asigned to the variable.

In the second example, $((X=X+1)) increments X by one ($((X++)) is also valid and shorter, but not necessarily supported by the shell), then expands to the new value of $X, which is the first argument to the null command, :. The null command ignores its arguments, and the result is discarded (with side effects).

I would personally prefer the first form because of three (relatively subjective) reasons:

  • The null command is obscure and misunderstood, as indicated by its often being the subject of confused questions here.
  • The first form seems more natural in terms of overall shell grammar, and even resembles the old evaluation style a little bit.
  • The first form is clearer and more concise and doesn't involve a command.

You'd have to use the first version if you were modifying the environment of just one command like

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

You'd have to use the second form to add evaluation to arguments directly:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

This has the desired side effects, saves one line, and is pretty clear.

Share:
13,112

Related videos on Youtube

J. M. Becker
Author by

J. M. Becker

Updated on September 18, 2022

Comments

  • J. M. Becker
    J. M. Becker almost 2 years

    When pre/post incrementing a variable, in POSIX Shell, what is the difference between these two examples. They seem like they would have the same consequences, but would they be used differently? When would you prefer one over the other?

    X=$((X+1))
    
    : $((X=X+1))