TCL中怎么样从文件中读取一行做为参数
约 579 字大约 2 分钟
2014-07-02
下面给出几种在 TCL 中「从文件里读出一行,并把它当成参数传给命令或过程」的常用写法。你可以根据场景(脚本/交互/错误处理/跨平台)挑一条直接复制用。
1. 最常见:一次只读第一行
#!/usr/bin/env tclsh
set fh [open "config.txt" r] ;# 以读模式打开
set line [gets $fh] ;# 读一行(不含换行符)
close $fh
# 把这一行当成参数调用 mycmd
exec mycmd $line
gets
返回去掉行尾换行符的字符串,可直接当参数用。- 如果文件可能为空,记得
if {$line eq ""} {...}
做兜底。
2. 读第 N 行(例如第 3 行)
proc read_nth {filename nth} {
set fh [open $filename r]
set n 0
while {[gets $fh line] >= 0} {
incr n
if {$n == $nth} {
close $fh
return $line
}
}
close $fh
return "" ;# 文件不足 nth 行
}
set arg [read_nth "config.txt" 3]
exec mycmd $arg
gets
返回的字节数 ≥ 0 代表读到数据;<0 表示 EOF。
3. 读随机一行(忽略空行)
set fh [open "config.txt" r]
set lines [split [read $fh] \n]
close $fh
set lines [lsearch -all -inline -not -exact $lines ""]
set arg [lindex $lines [expr {int(rand()*[llength $lines])}]]
exec mycmd $arg
read $fh
一次性读入整个文件,再用split
切成列表。- 适合小文件;大文件请用逐行方式避免内存暴涨。
4. 带错误处理模板
proc safe_read_first_line {filename} {
if {![file exists $filename]} {
error "$filename: 不存在"
}
if {![file readable $filename]} {
error "$filename: 不可读"
}
set fh [open $filename r]
set line [gets $fh]
close $fh
if {$line eq ""} {
error "$filename: 第一行为空或文件为空"
}
return $line
}
set arg [safe_read_first_line "config.txt"]
exec mycmd $arg
5. 如果行里有空格/引号怎么办?
TCL 的 exec
会自动帮你做正确的参数拆分,无需手动加引号:
# 文件内容: hello world 2025
set arg [gets $fh]
exec echo $arg
# --> 输出: hello world 2025
如果要把整行当一个参数,用 {}
或双引号包住即可:
exec mycmd "$arg"
速查表
目的 | 关键语句 |
---|---|
读第一行 | set line [gets $fh] |
读第 N 行 | 循环 gets 计数 |
读随机行 | lindex [split [read $fh] \n] |
去掉行尾 \r (Win) | set line [string trimright $line \r] |
检查空文件 | if {[eof $fh] && $line eq ""} |
把上面任意一段粘到你的脚本里,就能 “从文件读一行→当参数” 跑起来。