zsh-workers
 help / color / mirror / code / Atom feed
* bad math expression: illegal character: "
@ 2020-06-05 18:18 Artur Renault
  2020-06-05 21:01 ` Lawrence Velázquez
  0 siblings, 1 reply; 9+ messages in thread
From: Artur Renault @ 2020-06-05 18:18 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 690 bytes --]

Hello zsh maintainers,

I ran into an issue with running a sourced script on zsh.

It’s a simple repro. Take the script repro.sh:

while (( "$#" )); do
echo $1
shift
done

Running this with source gives me the following error:
[~] source repro.sh                                                                                            18:15:53
repro.sh:1: bad math expression: illegal character: "

The same script works fine on bash:
[~] bash -c "source repro.sh hello"                                                                            18:17:23
hello

Anyone know what the issue could be here?

This is on Ubuntu, with oh-my-zsh on top.

Thanks,
Artur

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-05 18:18 bad math expression: illegal character: " Artur Renault
@ 2020-06-05 21:01 ` Lawrence Velázquez
  2020-06-17 23:21   ` Bart Schaefer
  0 siblings, 1 reply; 9+ messages in thread
From: Lawrence Velázquez @ 2020-06-05 21:01 UTC (permalink / raw)
  To: Artur Renault; +Cc: zsh-workers

Hi Artur,


> On Jun 5, 2020, at 2:18 PM, Artur Renault <Artur.Renault@microsoft.com>
> wrote:
> 
> Hello zsh maintainers,
> 
> I ran into an issue with running a sourced script on zsh.
> 
> It’s a simple repro. Take the script repro.sh:
> 
> while (( "$#" )); do
> echo $1
> shift
> done
> 
> Running this with source gives me the following error:
> [~] source repro.sh                                                                                            18:15:53
> repro.sh:1: bad math expression: illegal character: "
> 
> The same script works fine on bash:
> [~] bash -c "source repro.sh hello"                                                                            18:17:23
> hello
> 
> Anyone know what the issue could be here?

For what it's worth, dash also rejects this. I assume that it and
zsh are just more strict about what constitutes a math expression.

I can't opine on which interpretation is "better", but you could
avoid the problem by removing the double quotes. Word splitting and
pathname generation are not performed inside ((...)) or $((...)).

vq

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-05 21:01 ` Lawrence Velázquez
@ 2020-06-17 23:21   ` Bart Schaefer
  2020-06-18 11:19     ` Mikael Magnusson
  0 siblings, 1 reply; 9+ messages in thread
From: Bart Schaefer @ 2020-06-17 23:21 UTC (permalink / raw)
  To: zsh-workers

On Fri, Jun 5, 2020 at 2:02 PM Lawrence Velázquez <vq@larryv.me> wrote:
>
> > On Jun 5, 2020, at 2:18 PM, Artur Renault <Artur.Renault@microsoft.com>
> >
> > while (( "$#" )); do
> >
> > repro.sh:1: bad math expression: illegal character: "
>
> For what it's worth, dash also rejects this. I assume that it and
> zsh are just more strict about what constitutes a math expression.

Does anybody know if this is something we should change for sh
emulation, or is it merely another unspecified POSIX corner-case?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-17 23:21   ` Bart Schaefer
@ 2020-06-18 11:19     ` Mikael Magnusson
  2020-06-19  6:38       ` Lawrence Velázquez
  0 siblings, 1 reply; 9+ messages in thread
From: Mikael Magnusson @ 2020-06-18 11:19 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: zsh-workers

On 6/18/20, Bart Schaefer <schaefer@brasslantern.com> wrote:
> On Fri, Jun 5, 2020 at 2:02 PM Lawrence Velázquez <vq@larryv.me> wrote:
>>
>> > On Jun 5, 2020, at 2:18 PM, Artur Renault <Artur.Renault@microsoft.com>
>> >
>> > while (( "$#" )); do
>> >
>> > repro.sh:1: bad math expression: illegal character: "
>>
>> For what it's worth, dash also rejects this. I assume that it and
>> zsh are just more strict about what constitutes a math expression.
>
> Does anybody know if this is something we should change for sh
> emulation, or is it merely another unspecified POSIX corner-case?

If this is a POSIX requirement, it must have been very specific about
when quotes should be allowed (bash):

$ (( "0" )); echo $?
1
$ echo $(( "0" ))
bash: "0" : syntax error: operand expected (error token is ""0" ")


-- 
Mikael Magnusson

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-18 11:19     ` Mikael Magnusson
@ 2020-06-19  6:38       ` Lawrence Velázquez
  2020-06-19 15:35         ` Sebastian Gniazdowski
  2020-06-19 15:55         ` Peter Stephenson
  0 siblings, 2 replies; 9+ messages in thread
From: Lawrence Velázquez @ 2020-06-19  6:38 UTC (permalink / raw)
  To: Mikael Magnusson; +Cc: Bart Schaefer, zsh-workers

> On Jun 18, 2020, at 7:19 AM, Mikael Magnusson <mikachu@gmail.com> wrote:
> 
>> On 6/18/20, Bart Schaefer <schaefer@brasslantern.com> wrote:
>> 
>>> On Fri, Jun 5, 2020 at 2:02 PM Lawrence Velázquez <vq@larryv.me> wrote:
>>> 
>>>> On Jun 5, 2020, at 2:18 PM, Artur Renault <Artur.Renault@microsoft.com>
>>>> 
>>>> while (( "$#" )); do
>>>> 
>>>> repro.sh:1: bad math expression: illegal character: "
>>> 
>>> For what it's worth, dash also rejects this. I assume that it and
>>> zsh are just more strict about what constitutes a math expression.
>> 
>> Does anybody know if this is something we should change for sh
>> emulation, or is it merely another unspecified POSIX corner-case?
> 
> If this is a POSIX requirement, it must have been very specific about
> when quotes should be allowed (bash):
> 
> $ (( "0" )); echo $?
> 1
> $ echo $(( "0" ))
> bash: "0" : syntax error: operand expected (error token is ""0" ")

Looks like the bash behavior changed at some point?

    % /bin/bash --version | head -n 1
    GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
    % /bin/bash -c '(( "0" )); echo $?'
    1
    % /bin/bash -c 'echo $(( "0" ))'
    /bin/bash: "0" : syntax error: operand expected (error token is ""0" ")

    % /opt/local/bin/bash --version | head -n 1
    GNU bash, version 5.0.17(1)-release (x86_64-apple-darwin18.7.0)
    % /opt/local/bin/bash -c '(( "0" )); echo $?'
    1
    % /opt/local/bin/bash -c 'echo $(( "0" ))'
    0

Anyway, unless I'm missing something, POSIX seems pretty clear about
this, as far as $((...)) goes:

    The expression shall be treated as if it were in double-quotes,
    except that a double-quote inside the expression is not treated
    specially. The shell shall expand all tokens in the expression
    for parameter expansion, command substitution, and **quote
    removal**. [Emphasis mine.]

    Next, the shell shall treat this as an arithmetic expression
    and substitute the value of the expression.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04

vq

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-19  6:38       ` Lawrence Velázquez
@ 2020-06-19 15:35         ` Sebastian Gniazdowski
  2020-06-19 15:55         ` Peter Stephenson
  1 sibling, 0 replies; 9+ messages in thread
From: Sebastian Gniazdowski @ 2020-06-19 15:35 UTC (permalink / raw)
  To: Lawrence Velázquez; +Cc: Mikael Magnusson, Bart Schaefer, Zsh hackers list

[-- Attachment #1: Type: text/plain, Size: 2662 bytes --]

Maybe a bash emulation could be added? Equal to:

    emulate zsh -o noshglob -o braceexpand -o kshglob

+ the quotes inside (( ))? emulate already accepts "bash" as the emulation
level.

On Fri, 19 Jun 2020 at 08:39, Lawrence Velázquez <vq@larryv.me> wrote:

> > On Jun 18, 2020, at 7:19 AM, Mikael Magnusson <mikachu@gmail.com> wrote:
> >
> >> On 6/18/20, Bart Schaefer <schaefer@brasslantern.com> wrote:
> >>
> >>> On Fri, Jun 5, 2020 at 2:02 PM Lawrence Velázquez <vq@larryv.me>
> wrote:
> >>>
> >>>> On Jun 5, 2020, at 2:18 PM, Artur Renault <
> Artur.Renault@microsoft.com>
> >>>>
> >>>> while (( "$#" )); do
> >>>>
> >>>> repro.sh:1: bad math expression: illegal character: "
> >>>
> >>> For what it's worth, dash also rejects this. I assume that it and
> >>> zsh are just more strict about what constitutes a math expression.
> >>
> >> Does anybody know if this is something we should change for sh
> >> emulation, or is it merely another unspecified POSIX corner-case?
> >
> > If this is a POSIX requirement, it must have been very specific about
> > when quotes should be allowed (bash):
> >
> > $ (( "0" )); echo $?
> > 1
> > $ echo $(( "0" ))
> > bash: "0" : syntax error: operand expected (error token is ""0" ")
>
> Looks like the bash behavior changed at some point?
>
>     % /bin/bash --version | head -n 1
>     GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
>     % /bin/bash -c '(( "0" )); echo $?'
>     1
>     % /bin/bash -c 'echo $(( "0" ))'
>     /bin/bash: "0" : syntax error: operand expected (error token is ""0" ")
>
>     % /opt/local/bin/bash --version | head -n 1
>     GNU bash, version 5.0.17(1)-release (x86_64-apple-darwin18.7.0)
>     % /opt/local/bin/bash -c '(( "0" )); echo $?'
>     1
>     % /opt/local/bin/bash -c 'echo $(( "0" ))'
>     0
>
> Anyway, unless I'm missing something, POSIX seems pretty clear about
> this, as far as $((...)) goes:
>
>     The expression shall be treated as if it were in double-quotes,
>     except that a double-quote inside the expression is not treated
>     specially. The shell shall expand all tokens in the expression
>     for parameter expansion, command substitution, and **quote
>     removal**. [Emphasis mine.]
>
>     Next, the shell shall treat this as an arithmetic expression
>     and substitute the value of the expression.
>
>
> https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
>
> vq



-- 
Sebastian Gniazdowski
News: https://twitter.com/ZdharmaI
IRC: https://kiwiirc.com/client/chat.freenode.net:+6697/#zinit
Blog: http://zdharma.org

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-19  6:38       ` Lawrence Velázquez
  2020-06-19 15:35         ` Sebastian Gniazdowski
@ 2020-06-19 15:55         ` Peter Stephenson
  2020-06-22 11:11           ` Peter Stephenson
  2020-06-23 23:51           ` Bart Schaefer
  1 sibling, 2 replies; 9+ messages in thread
From: Peter Stephenson @ 2020-06-19 15:55 UTC (permalink / raw)
  To: Lawrence Velázquez, Mikael Magnusson; +Cc: Bart Schaefer, zsh-workers

> On 19 June 2020 at 07:38 Lawrence Velázquez <vq@larryv.me> wrote:
> Anyway, unless I'm missing something, POSIX seems pretty clear about
> this, as far as $((...)) goes:
> 
>     The expression shall be treated as if it were in double-quotes,
>     except that a double-quote inside the expression is not treated
>     specially. The shell shall expand all tokens in the expression
>     for parameter expansion, command substitution, and **quote
>     removal**. [Emphasis mine.]
> 
>     Next, the shell shall treat this as an arithmetic expression
>     and substitute the value of the expression.
> 
> https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04

It's straightforward just to treat double quotes as if they're a
random spacing character.  Not sure the error is actually useful?
There was a test for it but that was simply to make sure we did
something with them.

pws

diff --git a/Src/math.c b/Src/math.c
index 905b910ec..b57ba42d4 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -831,6 +831,8 @@ zzlex(void)
 	case ' ': /* Fall through! */
 	case '\t':
 	case '\n':
+	case '"': /* POSIX says ignore these */
+	case Dnull:
 	    break;
 	default:
 	    if (idigit(*--ptr) || *ptr == '.')
diff --git a/Test/C01arith.ztst b/Test/C01arith.ztst
index 419f45292..d0092fefa 100644
--- a/Test/C01arith.ztst
+++ b/Test/C01arith.ztst
@@ -180,9 +180,10 @@
 1:bases beyond 36 don't work
 ?(eval):1: invalid base (must be 2 to 36 inclusive): 37
 
+  fail=39
   print $(( 3 + "fail" ))
-1:parse failure in arithmetic
-?(eval):1: bad math expression: operand expected at `"fail" '
+0:Double quotes are not treated specially in arithmetic
+>42
 
   alias 3=echo
   print $(( 3 + "OK"); echo "Worked")
@@ -487,3 +488,8 @@
   let noexist==0 )
 1:Arithmetic, NO_UNSET part 3
 ?(eval):2: noexist: parameter not set
+
+  print $(( "6+2" / "1+3" ))
+0:Double quotes are not treated specially in arithmetic (POSIX)
+# and do not do grouping!  this is 6 + (2/1) + 3
+>11

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-19 15:55         ` Peter Stephenson
@ 2020-06-22 11:11           ` Peter Stephenson
  2020-06-23 23:51           ` Bart Schaefer
  1 sibling, 0 replies; 9+ messages in thread
From: Peter Stephenson @ 2020-06-22 11:11 UTC (permalink / raw)
  To: zsh-workers

> On 19 June 2020 at 16:55 Peter Stephenson <p.w.stephenson@ntlworld.com> wrote:
> It's straightforward just to treat double quotes as if they're a
> random spacing character.  Not sure the error is actually useful?
> There was a test for it but that was simply to make sure we did
> something with them.

(In mathematical expressions.)

Doesn't sound like this is problematic, so I will commit it at some point.

pws

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: bad math expression: illegal character: "
  2020-06-19 15:55         ` Peter Stephenson
  2020-06-22 11:11           ` Peter Stephenson
@ 2020-06-23 23:51           ` Bart Schaefer
  1 sibling, 0 replies; 9+ messages in thread
From: Bart Schaefer @ 2020-06-23 23:51 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: Lawrence Velázquez, Mikael Magnusson, zsh-workers

Sorry for the very delayed response on this, given that it has already
been committed, but:

On Fri, Jun 19, 2020 at 8:55 AM Peter Stephenson
<p.w.stephenson@ntlworld.com> wrote:
>
> It's straightforward just to treat double quotes as if they're a
> random spacing character.

Doesn't the POSIX requirement say "not treated specially"?  Treating
them as spaces rather than as themselves seems like "special"
treatment to me.  The original error might have been more in the
spirit of the directions.  On the other hand they're meaningless as
themselves, except to cause that very error, so I don't really have an
objection.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-06-23 23:52 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-05 18:18 bad math expression: illegal character: " Artur Renault
2020-06-05 21:01 ` Lawrence Velázquez
2020-06-17 23:21   ` Bart Schaefer
2020-06-18 11:19     ` Mikael Magnusson
2020-06-19  6:38       ` Lawrence Velázquez
2020-06-19 15:35         ` Sebastian Gniazdowski
2020-06-19 15:55         ` Peter Stephenson
2020-06-22 11:11           ` Peter Stephenson
2020-06-23 23:51           ` Bart Schaefer

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).