On Mon, Jul 03, 2023 at 05:24:49PM -0400, Chet Ramey wrote: > It's really more like > > a=(); a[0]=1 a[1]=2 a[2]=3 > > and the += variant omits the initial array flush.
Oh, yes. I knew it, but I forgot to mention it. > > I would have expected: > > > > $ a=([1]=hi [100]=foo [-1002]=bar boo [200]=baz); echo "won't run" > > bash: [-1002]=bar: bad array subscript > > $ declare -p a > > bash: declare: a: not found > > > > But it seems bash actually behaves like so: > > > > $ a=([1]=hi [100]=foo [-1002]=bar boo [200]=baz); echo "will run" > > bash: [-1002]=bar: bad array subscript > > will run > > $ declare -p a > > declare -a a=([1]="hi" [100]="foo" [101]="boo" [200]="baz") > > > > So it simply skips and prints a warning for invalid indices, and still > > sets all the other valid indices, without triggering an error for the > > assignment; even though a[-1002]=bar on its own would have triggered > > an error: > > > > $ a[1]=hi a[100]=foo a[-1002]=bar a[200]=baz; echo "won't run" > > bash: [-1002]=bar: bad array subscript > > $ declare -p a > > declare -a a=([1]="hi" [100]="foo") > > So how about we make the behaviors converge a little bit better: compound > assignment breaks on the first invalid assignment and makes the assignment > statement fail, which can be treated as an assignment error. Sounds good, I like that. Thank you! o/ emanuele6