Paul L. Snyder on 19 May 2005 20:03:08 -0000 |
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
|
|