2013-07-15 198 views
2

有人可以解释为什么这一直失败吗?为什么用'['失败?

set hostname "" 

if {$hostname eq ""} { 
    puts "Usage: host [-u username] [-p password] [-f]" 
    exit 5 
} 

if {[string length $hostname] == 0} { 
    puts "Usage: host [-u username] [-p password] [-f]" 
    exit 5 
} 

if {[string equal $hostname ""]} { 
    puts "Usage: host [-u username] [-p password] [-f]" 
    exit 5 
} 

我得到以下错误:

invalid command name "-u" 
    while executing 
"-u username" 
    invoked from within 
"if {$s eq ""} {puts "Usage: host [-u username] [-p password] [-f]"}" 

代码似乎执行罚款,但我似乎无法使用看跌期权与包含括号的字符串。

回答

8

双引号字符串中的方括号表示评估。尝试用反斜杠转义方括号。

+1

我只是闯入Tcl和我发现,它与其它语言相比有不少怪癖。谢谢你的答案。 我也发现用大括号括起来的字符串可以纠正问题,并且只有附加字符串中的附加大括号才需要被转义。 – Zhro

+0

是的,Ousterhout得到了绝大部分的正确,但评价部分一直是Tcl的致命弱点。 – 2013-07-15 04:53:02

+8

@Yatin事实上,这种语言比其他语言更加一致。除非你不费吹灰之力地引用它们,否则括号总是意味着相同的东西,所以你知道你必须煞费苦心。完全可预测的。 –

7

另一种方法是使用不同的报价为您打印字符串:

puts {Usage: host [-u username] [-p password] [-f]} 

括号像shell的单引号:他们防止支架引号的字符串内的置换。

您可能还需要花一些时间来学习Tcl的12语法规则:
http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm

+0

是的,这正是我最终做的。 – Zhro