help-bash
[Top][All Lists]
Advanced

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

Re: whats wrong with (( a = 8 , a > 4 && a -= 2 || a-- )) , bash: ((: a


From: Kerin Millar
Subject: Re: whats wrong with (( a = 8 , a > 4 && a -= 2 || a-- )) , bash: ((: a = 8 , a > 4 && a -= 2 || a-- : attempted assignment to non-variable (error token is "-= 2 || a-- ")
Date: Thu, 23 Mar 2023 12:03:42 +0000

On Thu, 23 Mar 2023 12:38:58 +0100
alex xmb ratchev <fxmbsw7@gmail.com> wrote:

> On Thu, Mar 23, 2023, 12:21 Kerin Millar <kfm@plushkava.net> wrote:
> 
> > On Thu, 23 Mar 2023 11:32:33 +0100
> > alex xmb ratchev <fxmbsw7@gmail.com> wrote:
> >
> > > i remember doing && (( code
> > > maybe i didnt '=' in action there
> > >
> > > (( a = 8 , a > 4 && a -= 2 || a-- ))
> > >
> > > bash: ((: a = 8 , a > 4 && a -= 2 || a-- : attempted assignment to
> > > non-variable (error token is "-= 2 || a-- ")
> > >
> > >
> > > (( a = 8 , a > 4 && a-- && a-- || a-- ))
> > >
> > > works
> > > a=6
> > >
> > > ..
> > > i suppose this is a (( lex bug where u didnt include || && in op for =
> >
> > I agree that it looks like a possible bug in the parser. It works if
> > parentheses are used to disambiguate one of the subtractions.
> >
> > $ (( a = 8 , a > 4 && (a -= 2) || a-- )); declare -p a
> > declare -- a="6"
> >
> > Even when made to work, I would consider it to be poor. Consider what
> > happens below. It is a fine example of what can happen in the course of
> > writing unconventional code without understanding the consequences.
> >
> 
> i extra >4 to prevent minus

Yes, but ...

> 
> $ (( a = 2 , a > 1 && (a -= 2) || a-- )); declare -p a
> > declare -- a="-1"

The point was that the intent of the code doesn't match the outcome. The code 
suggests that 2 should be deducted from 2. Instead of 0, we end up with -1. So, 
&& || is a fairly effective way of writing bugs (just as it can be outside the 
arithmetic context, sometimes).

-- 
Kerin Millar



reply via email to

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