テストの2番目の部分、つまり
{ $HI == 1 }
Tclで中括弧の意味について混乱したと思いますので、間違っています。中括弧はと同じで( ... )はありません。評価で使用される優先順位を変更するために数式で使用することはできません。
中括弧は、スペースを含む文字列を構成し、Tclコマンドの単一の引数として表示されるようにするために使用されますが、その内部で置換は実行されません。
あなたの場合、$HIは変数の値で置き換えられないHIので、先頭と末尾のスペースを含め、中括弧内に表示されるすべての正確な文字を含む文字列を形成しています。
もし、するなら
if {{ $HI == 1 } eq {$HI == 1}} {
puts "same"
} else {
puts "not the same"
}
not the same結果として得られます。(eq式内で文字列比較を実行します。)
二重引用符を文字列の区切り文字として使用する場合も、正しい意味は得られません。
" $HI == 1 "
この場合、変数は実際にはその値に置き換えられるため、直接記述したようになります(コードのように、と仮定$HIし1ます)。
" 1 == 1 "
しかし、それは文字列です。
なぜTclは文句を言うのですか?それが言うように、あなたはのオペランドとして非数値文字列を使用しようとしていますが、数値として表示する方法がないため数値&&ではありません。そのため、Tclは数値に応じてtrue / false値に変換できません( 0の場合はfalse、0でない場合はtrue)、エラーが発生します。{ $HI == 1 }
あなたが本当に書きたかったのは
if { [ info exists HI] && ( $HI == 1 ) } { puts "Hello World "}
# ^ ^
# |__________|____ note ( ) instead of { }
==に関してより高い優先順位を与えるため&&、または条件をより明確にするため。exprのテスト条件内で暗黙的に呼び出される、はif、他のプログラミング言語や数学で見られるのと同じ意味を持つ丸括弧について知っています。評価順序を変更します。
他の回答やコメントで指摘されているように、(Cや他の多くの言語と同様に)equal演算子==はブール値や。よりも優先度が高いため、角かっこは必要ありません&&。( ... )ただし、必要に応じて、恐れることなく使用できます。
if {2 - 1 * 2} { puts yes } { puts no }
式は0noとして評価されるため、を与えます。2 - (1 * 2)
if {(2 - 1) * 2} { puts yes } { puts no }
は2だからyesです。(2 - 1) * 2