C-shell环境变量传入Tclsh后判断异常问题咨询
Tcl中
info exists $env(FOO)判断环境变量存在性失败的原因 问题重现
在C-shell和tclsh中执行以下命令及输出:
c-shell> setenv FOO bar c-shell> echo $FOO bar c-shell> tclsh % puts $env(FOO) bar % if {[info exists $env(FOO)] && $env(FOO)=="bar"} {puts "Hello"} else {puts "World"} World % if {[info exists $env(FOO)]} {puts "Hello"} else {puts "World"} World
明明环境变量FOO已经传入tclsh(puts $env(FOO)能输出bar),但用[info exists $env(FOO)]判断存在性却返回假,执行else分支输出World。
原因解析
问题出在info exists的用法逻辑上:
info exists的参数要求是变量的名称,而不是变量的值。- 在Tcl里,
$env(FOO)是读取关联数组env中键为FOO的元素值,也就是字符串bar。所以[info exists $env(FOO)]实际是在判断:当前是否存在一个名为bar的普通Tcl变量(不是环境变量)。你显然没定义过这个变量,所以返回假,自然进入else分支。 - 你觉得
$env(FOO)被解析为0是误解,实际是info exists返回了0(代表假),导致条件不成立。
正确写法
要判断环境变量FOO是否存在,直接把关联数组的元素标识(不带$符号)传给info exists即可:
if {[info exists env(FOO)] && $env(FOO) == "bar"} { puts "Hello" } else { puts "World" }
执行这段代码会输出Hello,因为info exists env(FOO)能正确判断关联数组env中是否存在FOO这个键(也就是对应环境变量是否存在)。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

