Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Use of == in functions



Stephane Chazelas wrote on Sun, 12 Jan 2020 12:03 +00:00:
> [repost to zsh-users. I'll see if I can add a mutt hook to avoid
> the problem in the future].
> 
> 2020-01-12 11:09:06 +0100, Kusalananda Kähäri:
> [...]
> > == within [[ ]]
> > =  within [   ]
> > 
> > ... just like in bash (but bash allows its built in test/[ utility to
> > understand == too)
> [...]
> 
> zsh's [ builtin also supports == as an alias of = (like its [[
> ]] construct also supports == as an alias of =), but in zsh,
> =cmd is an operator that expands to the path of the cmd command,
> 
> $ echo =ls
> /usr/bin/ls
> 
> so you would need:
> 
> [ a '==' b ]
> 
> (or disable the =cmd feature with set +o equals) if for some
> reason you wanted to use the non-standard == in place of =.
> 
> Just like you need
> 
> [ a '=~' regex ]
> 
> for regex matching.
> 
> And
> 
> [ a '<' b ]
> 
> to compare strings lexically as < is also a redirection
> operator.
> 
> Now, as none of <, ==, =~ are standard [ operators (so sh
> compatibility is no longer a good reason to use the "["
> command), you might as well use the ksh-style [[...]] construct
> which doesn't have this kind of issue:
> 
> [[ a =~ b ]], [[ a < b ]], [[ a == b ]] are all fine (but then
> again, there's no need to double the =. == is an operator that
> is needed in languages where there's a need to disambiguate
> between assignment and equality comparison, but inside [[...]]
> (as opposed to ((...)) for instance), there's no assignment)

The reason for the difference between «[ x == y ]» and «[[ x == y ]]» is
that [ is a _builtin_, so it's parsed using the same rules as any random
external command, whereas [[ is a _reserved word_, part of the syntax,
like '&&', so the normal command line syntax rules don't apply within
it.  This is also why «[[ -n foo && -n bar ]]» works



Messages sorted by: Reverse Date, Date, Thread, Author