x
是设备名称列表(设备-1,设备-2,设备-3)
通过连接字符串端口为每个device1创建一个变量,最终得到$device-1port
。
循环遍历x创建
[expr $${x}port-2000 ] #x is device-1 so it is trying $device-1port-2000 which throws error.
我想将$device-1port
的数值变为没有短划线的变量。
set xvar $${x}port
[expr $xvar-2000 ]
或者我可以将$${x}port
包装在expr
语句中。
答案 0 :(得分:3)
要读取名称中带插值的变量,请使用单参数set
:
set withoutadash [set device-${x}port]
通常,最好将数组用于此类事情。
答案 1 :(得分:0)
使用这些复杂变量的最好方法之一是使用upvar
命令为变量创建一个本地“漂亮”别名。特别是,upvar 0
为局部变量创建了一个局部别名;有点棘手,但是一种已知的技术。
upvar 0 ${x}port current_port
现在,我们对current_port
的读取,写入或取消设置与具有尴尬名称的端口的读/写/取消设置相同,您可以简单地编写代码:
puts [expr { $current_port - 2000 }]
set current_port 12345
# etc.
在当前程序结束时将忘记别名。
当然,您可能应该考虑使用数组。它们只是更简单,您不需要努力使用计算变量名称:
set x 1
set device($x,port) 12345
puts [expr {$device($x,port) - 2000}]