2013-07-15 156 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