help-bash
[Top][All Lists]
Advanced

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

Re: [Help-bash] Arithmetic evaluation / expansion question


From: Bruce Hohl
Subject: Re: [Help-bash] Arithmetic evaluation / expansion question
Date: Wed, 10 Oct 2018 20:49:26 +0000

> As Andy said, things that can be parsed as variable names are treated
> as variable names in arithmetic contexts.
I understand and noted that as described in the man page. I can see the
following from bash:

$ pd=abc; echo $pd
abc
$ echo $((pd))
0
$ echo $(($pd))
0

I noted in the man page that null or unset variables evaluate to zero.
Above, pd is a defined variable which holds "abc" (a string not beginning
with zero - non-octal)
pd is "arithmetically" evaluated to zero.  Is this as intended?  I.E. can
this behavior be relied upon?

> What he didn't mention was
> that bash does this *recursively* until it gets to an integer, or to
> something that can't be parsed as either an integer or a variable name.
That is good to know !

On Wed, Oct 10, 2018 at 5:31 PM Andy Chu <address@hidden> wrote:

> To be clearer here is an example of the recursive eval (in $(( )) rather
> than [[ ]], but it's the same thing in both places):
>
> $ one=1
> $ two=2
> $ x='one + two'
> $ code='4 > 2 ? x : y'
> $ echo $(( code ))
> 3
>
> But don't do that :)  Or use eval explicitly.
>
>
> On Wed, Oct 10, 2018 at 10:25 AM Andy Chu <address@hidden> wrote:
>
> > Right, I have seen this very odd recursive behavior.  It doesn't appear
> to
> > be documented, but one of the very first bugs filed against OSH mentions
> it:
> >
> > https://github.com/oilshell/oil/issues/3
> >
> > In this case it's one the operands of  [[ a -eq b ]].  Not only can 'a'
> be
> > a variable that contains a varaible name, etc. -- it can be an entire
> > arithmetic expression.
> >
> > In other words, it can be thought of as an implicit recursive 'eval'  as
> > well.  Basically bash tries as hard as it can to make things integers in
> > arithmetic contexts.  It's even more aggressive than awk or Make, which
> > also work with integers-as-strings.
> >
> > (I chose not to copy this behavior since "important" shell scripts don't
> > appear to rely on it.)
> >
> > Andy
> >
> >
> >
> > On Wed, Oct 10, 2018 at 10:09 AM Greg Wooledge <address@hidden>
> > wrote:
> >
> >> On Wed, Oct 10, 2018 at 12:47:05PM -0400, Bruce Hohl wrote:
> >> > Are strings also evaluated to zero within $(( ))?
> >> >
> >> > $ pd=abc
> >> > $ echo $pd
> >> > abc
> >> > $ echo $((pd))
> >> > 0
> >>
> >> As Andy said, things that can be parsed as variable names are treated
> >> as variable names in arithmetic contexts.  What he didn't mention was
> >> that bash does this *recursively* until it gets to an integer, or to
> >> something that can't be parsed as either an integer or a variable name.
> >>
> >> wooledg:~$ a=b b=c c=d d=e e=f f=42; echo $((a))
> >> 42
> >>
> >>
>


reply via email to

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