bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Curious case of arithmetic expansion


From: Florian Mayer
Subject: Re: Curious case of arithmetic expansion
Date: Sun, 23 Apr 2017 15:07:20 +0200

It does not matter, how this construct in this particular context is called.
The difference between $(()) and (()) is that $(()) actually expands to something
whereas (()) just executes a C-like _expression_. In ((<_expression_>)) <_expression_> can also
include assignments, as the bash manual that you properly cited, also elaborates on.
You can do, for example, things like
$ foo=2
$ ((foo+=100)) # fo is now 102
$ ((++(foo++)))
or even
$ ((foo++, foo++, foo++, foo++, foo+=100))
and (oh boy why) even
$ foo=(123 321)
$ ((foo[0]++, foo[1]—))

So I might have chosen the wrong subject text for this mail,
but again, it does not matter whether those constructs actually expand to some string
or not. The side effects are what matter here. And in my opinion those are not correct...

Am 23.04.2017 um 14:43 schrieb Pierre Gaston <pierre.gaston@gmail.com>:



On Sun, Apr 23, 2017 at 3:28 PM, Florian Mayer <mayerflorian@me.com> wrote:
What I’m saying is, that if bash does recursively apply expansion
mechanisms on the identifiers until it can retrieve a number, 
it should do it symmetrically. That is,
it should remember what chain of expansion had been necessary for
a particular number to appear at the end of the expansion.

So instead of 
124 moo 123
The echo command should produce
bar moo 124

(The expansion chain here was foo->bar->moo->123)

It's because it's not really indirection, rather the content of the variable is evaluated:
No it is really indirection. Bash even has a special (and very limited) syntax for that.
Consider 
$ foo=bar; bar=moo
You can get the string „moo“ through foo by using
$ echo ${!foo}

$ echo ${!!foo} # or something else does not work, though...

 
This is indirection indeed, but in arithmetic evaluation it's not.

Quoting the manual:

"The value of a variable is evaluated as an  arithmetic  _expression_
 when  it  is  referenced, or when a variable which has been given the integer attribute using declare -i is assigned a value. "

Consider this:
foo=1+3
echo $foo
echo $((foo++))
echo $foo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]