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.gas...@gmail.com>: > > > > On Sun, Apr 23, 2017 at 3:28 PM, Florian Mayer <mayerflor...@me.com > <mailto:mayerflor...@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 >