我有一个包含此代码段的脚本:
while {[gets $fin line] != -1} {
if {[string first "Modem :" $line] != -1} {
set line2 [string range $line 17 end]
puts $fout "One : \t$line2"
}
puts $fout "Two : \t$line2"
}
One :
有效并打印输出(当我不在脚本中包含Two :
部分时),但当我加入Two :
时,会显示
error : can't read "line2": no such variable
while executing
"puts $fout "Two : \t$line2""
("while" body line 14)
在line2
退出后,它是否保持if
的价值?
答案 0 :(得分:1)
通过聊天,this是$fin
的示例。
代码的问题是while {[gets $fin line] != -1}
一次遍历$fin
的每一行,而不是一堆。 read
是将所有行放在一个变量中的命令。
这意味着当读取第一行时,您在循环的第一次迭代中没有$line1
或$line2
,因此puts
将无法检索这些名称的变量。
我建议的解决方案是首先获取所需的每个变量,然后在为'块收集所有内容时,立即打印所有变量。
set fin [open imp_info r]
set fout [open imfp_table w]
puts $fout "LINK\tModem Status"
puts $fout "----\t------------"
while {[gets $fin line] != -1} {
# If there is "wire-pair (X)" in the line, get that number
regexp -- {wire-pair \(([0-9]+)\)} $line - wire_pair_no
# Last column, get the value and puts everything
if {[regexp -- {Modem status: ([^,]+)} $line - status]} {
puts $fout "$wire_pair_no\t$status"
}
}
输出:
LINK Modem Status
---- ------------
0 UP_DATA_MODE
1 UP_DATA_MODE
答案 1 :(得分:0)
如果您在此循环中读到第一行:
while {[gets $fin line] != -1} {
if {[string first "Modem :" $line] != -1} {
set line2 [string range $line 17 end]
puts $fout "One : \t$line2"
}
puts $fout "Two : \t$line2"
}
你的某个地方没有“Modem :
”,条件不满足,处理if
时未触及变量。以下puts
失败,因为line2
变量尚未设置为任何内容;那里没有变量,$
语法完全不喜欢它。
一种可能的解决方法是在循环开始之前将line2
设置为某些内容:
set line2 "DUMMY VALUE"
或许您应该将您在那里阅读的变量更改为line
而不是line2
。
puts $fout "Two : \t$line"
或许您应该在阅读之前测试变量是否存在:
if {[info exists line2]} {
puts $fout "Two : \t$line2"
}
一切都会奏效,但他们会做不同的事情,我不知道你想要什么......