Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does expr "i==i" fail with "invalid bareword"?

Tags:

tcl

1)

% expr "1==1"
1

2)

% expr "i==i"
invalid bareword "i"
in expression "i==i";
should be "$i" or "{i}" or "i(...)" or ...

Why am getting this error in step - 2

1) % if {"i" == "i"} {
    puts "hai"
  }
  hai



2) % if {i == "i"} {
   puts "hai"
  }

invalid bareword "i"
in expression "i == "i"";
should be "$i" or "{i}" or "i(...)" or ...

if {"i" == "i"} This is wotking with if condition .

Here I found like expr command evaluating only integers , not comparing strings , But the In "if" condition everything (integer as well as string) are evaluating .

How Things are working here ?

like image 892
velpandian Avatar asked Aug 30 '26 16:08

velpandian


1 Answers

The answer is in the expr man page.

Operands may be specified in any of the following ways:
...
[4]    As a string enclosed in double-quotes.   The  expression  parser
       will  perform  backslash, variable, and command substitutions on
       the information between the quotes, and use the resulting  value
       as the operand

[5]    As a string enclosed in braces.  The characters between the open
       brace and matching close brace will be used as the operand with‐
       out any substitutions.
...

So, expr can compare strings, but you must enclose them in double quotes or curly braces, depending on whether you want substituions performed or not.

Therefore, in your example 2, you must use

% expr {"i" == "i"}

or

% expr {{i} == {i}}

Better to user the string comparison operands:

% expr {"i" eq "i"}
% expr {{i} eq {i}}

to be sure that the content of the string is not converted to numerical values.

like image 185
Marco Pallante Avatar answered Sep 02 '26 13:09

Marco Pallante



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!