|
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 11:21:44 +0000 |
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. $ (( a = 2 , a > 1 && (a -= 2) || a-- )); declare -p a declare -- a="-1" If you must do this sort of thing, use the conditional operator instead e.g. (( a = 8, a = (a > 4) ? a - 2 : a - 1 )). Alternatively, just avoid doing assignments in arithmetic expressions except where there's a clear advantage (I cannot see one in this case). -- Kerin Millar
[Prev in Thread] | Current Thread | [Next in Thread] |