Dan Crosta on 20 May 2005 00:43:01 -0000 |
Paul L. Snyder wrote: >Quoting "Michael C. Toren" <mct@toren.net>: > > > >>On Thu, May 19, 2005 at 02:04:31PM -0400, Dan Crosta wrote: >> >> >>> n=`echo "$n + 1" | bc` >>> >>> >>You can use bash's $((..)) arithmetic substitution. For example: >> >> echo $((n++)) >> >> > >One thing that can be confusing to aspiring shell progammers: > > bash$ n=3 > bash$ n=$((n++)) > bash$ echo $n > 3 > >What happened here? The trick is that '++' is the postincrement >operator, which works via side-effects. So what's really happening is: > > 1. bash reads in the command "n=3" and stores '3' in the parameter 'n'. > 2a. bash reads in the command "n=$((n++))" > 2b. bash performs arithmetic expansion on the command. '++' means "do > something with this variable, then increment it. So bash replaces > the command-line with "n=3" (the current value of n) and behind > the scenes it increases the value store in 'n' by 1, so now '4' is > stored in 'n'. > 2c. bash executes the command "n=3", which stores '3' in 'n'. Whoops! > 3a. bash reads in the command "echo $n". > 3b. bash performs parameter expansion on the command, which is now > "echo 3" > 3c. bash executes the command, echoing '3' to the output. > >Here's a way around that if you just want to increment a variable: > > bash$ : $((n++)) > >The ':' is the null-command. It's often used when you just want to expand >the arguments and not do anything with them. In mct's example above, if >n=3, then the command will output '3' and change the value stored in 'n' >to '4' as a side-effect. > > bash$ echo $((++n)) > >may be less confusing, as it changes the value store in 'n' before it >does anything else with it. > >pls >___________________________________________________________________________ >Philadelphia Linux Users Group -- http://www.phillylinux.org >Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce >General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug > > if anyone's confused, just imagine what would happen in C (or your favorite language) if you did: n = 3; n = n++; it does the same thing. took me a while to realize the same stuff is going on here. dsc ___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug
|
|