在tcl脚本中_ _ _处缺少操作数

时间:2014-04-22 14:41:36

标签: shell if-statement open-source tcl tclsh

在if条件中我想检查字符串是否包含模式,但是我遇到了跟​​随错误。 missing operand at _@_ in expression " $extra_url eq _@_*user-new* " (parsing expression " $extra_url eq *user-n...") invoked from within "if { $extra_url eq *user-new* } {

代码如下:

if { $extra_url eq *user-new* } {
     ds_add rp [list notice "File $root/$extra_url: Not found" $startclicks [clock clicks -milliseconds]]
     ds_add rp [list transformation [list notfound "$root / $extra_url" $val] $startclicks [clock clicks -milliseconds]]

 }

这里我正在检查extra_url字符串是否包含“user_new”。 我不知道我是否做得对。请帮忙。

3 个答案:

答案 0 :(得分:3)

你的问题就在这一行:

if { $extra_url eq *user-new* } {

问题是表达式解析器将*的{​​{1}}视为乘法运算符,并且您连续有两个二元运算符,其间没有值标记,这是非法语法。实际上,对于表达式解析器,您可能也写过:

*user-new*

好的,这只是在令牌化之后,并且在双运算符之后还有其他问题,即无法识别的裸字和尾随的二元运算符;解析失败。 (是的,表达式解析器是一个非常传统的解析器,与用于解析C或Java的解析器完全不同(虽然比它们简单)...)

我猜你实际上要求字符串与文字标记相等(将标记放在$extra_url eq * user - new * 大括号{}中引用")或者您想使用命令来测试更复杂的情况,例如与"的全局匹配。因此,选择其中一个:

string match
if { $extra_url eq {*user-new*} } {
if { $extra_url eq "*user-new*" } {

答案 1 :(得分:1)

检查extra_url字符串是否包含" user_new":

if {[string match {*user_new*} $extra_url]} { ... }

if {[string first "user_name" $extra_url] != -1} { ... }

switch -glob $extra_url {
    {*user_name*} { ... }
}

if {[regexp "user_name" $extra_url]} { ... }

eq严格用于字符串相等。

答案 2 :(得分:0)

假设你正在尝试一个精确的字符串比较,补充Donal Fellows',从手册页(带有剪切和改编):

if command将条件计算为表达式(与expr计算其参数的方式相同)。

Operands for the expr command可以通过以下任何一种方式指定:

  1. 用双引号括起来的字符串。 [...]
  2. 用括号括起来的字符串。 [...]
  3. 请注意,它隐含地排除了裸字符串。必须附上它们。

    我不确定为什么(也许正是为了避免像你这样的字符串和有效的expr运算符之间的混淆),因此它偶尔会咬我一次。