|
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
|
Re: [PLUG] bash, double for
|
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
|
|