2

How do I assign x the value of x + 1? I can do it in other languages but can't figure it out in bash.

4 Answers 4

7

I just tested two different ways and both worked for me:

x=$((x+1))

...or...

x=$((++x))
0
3

this should do the work

let x=$x+1
3
  • That gets a return of 1.
    – JShoe
    May 22, 2011 at 3:39
  • let x=x+1 should be let x=$x+1. That is likely the reason it is returning one.
    – Bandit
    May 22, 2011 at 3:54
  • oops, missed the dollar May 22, 2011 at 4:24
1

This might work:

x = `expr $x + 1`
5
  • Nope. It assigns what's in the quote to x.
    – JShoe
    May 22, 2011 at 3:36
  • 1
    @JShoe: Those weren't quotes, they were grave accents. On most keyboards, they're located to the left of the 1 key, on the key you press with Shift to enter a tilde (~).
    – Patches
    May 22, 2011 at 4:30
  • 1
    Also known as backticks in the context of computing. May 22, 2011 at 5:54
  • Another reason not to use backticks anymore, but rather $() ;)
    – slhck
    May 22, 2011 at 8:53
  • Though a valid answer, expr is old school. It makes you shell out, an unnecessary process. The syntax in @Bandit 's answer is more modern, and is done in-shell. May 27, 2011 at 21:45
0

@Bandit's answer is fine, but I want to highlight the difference that "let" and (( )) make to normal shell syntax:

let x++

causes bash (or ksh, or any POSIX shell) to treat the expression as an "arithmetic evaluation" in which the referenced variables don't need to be preceeded with "$". One advantage of using (( )) is that otherwise-special tokens don't need to be quoted or escaped, e.g. "*" for multiplication as in:

(( x = x * 2 ))

I find this syntax slightly clearer than $(( )) which uses the output of the expression, e.g.

x=$(( x * 2 ))

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .