2013-04-09 28 views
1

我的代码这一艰巨块:写出的变量文本值到文件

exec zip -r $FULLPATH error.log [ append datetime $RECENT ".bwdb" ] [ append txt $testName ".txt" ] [ append lancap $testName "-lan.cap" ] \ 
     [ append lanmcap $testName "-lan-m.cap" ] [ append wancap $testName "-wan.cap" ] [ append wanmcap $testName "-wan-m.cap" ] [ append conf $confFile ".conf" ] \ 
     start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap [ append comments "comments-" $RECENT ".bwc" ] 

这实际上只是荏苒一堆文件一起。我正在改变生成zip文件的方式(更准确地说,当我生成时,我正在更改)。我决定这样做的方式是将每个命令保存到文本文件中,然后在需要创建文件时通过文件中的每个命令。问题是我有一堆我需要转换成文字形式的变量。

有谁知道我该如何将此命令转换为它的文字值并将其存储到文本文件中?

编辑:我也愿意听到其他建议,以解决相同的问题,和/或任何利弊做我的建议。

EDIT2:感谢所有帮助,我选择这样做:

set data123 "exec zip -r $FULLPATH error.log [ append datetime $RECENT \".bwdb\" ] [ append txt $testName \".txt\" ] [ append lancap $testName \"-lan.cap\" ] \ 
     [ append lanmcap $testName \"-lan-m.cap\" ] [ append wancap $testName \"-wan.cap\" ] [ append wanmcap $testName \"-wan-m.cap\" ] [ append conf $confFile \".conf\" ] \ 
     start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap [ append comments \"comments-\" $RECENT \".bwc\" ]" 

set datafile123 "datafile123.txt" 
set fileId123 [ open $datafile123 "w" ] 
puts $fileId123 $data123 
close $fileId123 

然而,当我看到生成的文件我看到:

exec zip -r /home/IOL/TR069_Certification/Results/TEST_Round99_GetRPCMethods_CDR1_20130410172812 error.log 20130410172812.bwdb20130410172812".bwdb" GetRPCMethods.txtGetRPCMethods".txt" GetRPCMethods-lan.capGetRPCMethods"-lan.cap" GetRPCMethods-lan-m.capGetRPCMethods"-lan-m.cap" GetRPCMethods-wan.capGetRPCMethods"-wan.cap" GetRPCMethods-wan-m.capGetRPCMethods"-wan-m.cap" IOL.confIOL".conf" start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap comments-20130410172812.bwc"comments-"20130410172812".bwc" 

这似乎是制作连接字符串的第二个副本在每个附加的末尾,我无法弄清楚为什么。

回答

0

我基本上只是做你的建议:将文字值写入文本文件。 一种方式做,这将是如此简单:

set s "" 
append s \ 
    error.log \n \ 
    $datetime $RECENT .bwdb \n \ 
    $txt $testName .txt \n \ 
    $lancap $testName -lan.cap \n \ 
    $lanmcap $testName -lan-m.cap \n \ 
    $wancap $testName -wan.cap \n \ 
    $wanmcap $testName -wan-m.cap \n \ 
    $conf $confFile .conf \n \ 
    start.txt \n start-lan.cap \n \ 
    start-lan-m.cap \n start-wan.cap \n start-wan-m.cap \n \ 
    $comments comments- $RECENT .bwc 
set f [open /path/to/file w] 
puts $f $s 
close $f 

这将创建每行一个文件名的文本文件。

另一个—更直接—返工看起来是这样的:

set files [list] 
lappend files \ 
    error.log \ 
    [ append datetime $RECENT ".bwdb" ] \ 
    [ append txt $testName ".txt" ] \ 
    [ append lancap $testName "-lan.cap" ] \ 
    [ append lanmcap $testName "-lan-m.cap" ] \ 
    [ append wancap $testName "-wan.cap" ] \ 
    [ append wanmcap $testName "-wan-m.cap" ] \ 
    [ append conf $confFile ".conf" ] \ 
    start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap \ 
    [ append comments "comments-" $RECENT ".bwc" ] 
set f [open /path/to/file w] 
puts $f [join $files \n] 
close $f 

我怀疑这个用法append虽然这里这个命令似乎为它的副作用,不能仅使用。 append将其第二个到最后一个参数的字符串附加到位于变量名称中的字符串,该变量的名称作为其第一个参数传递,返回结果字符串。我不喜欢这样的事实,即在你原来的例子中(在我的第二个例子中)append似乎只用于那个返回值。

所以可能更习惯的方法是使用简单的字符串拼接的Tcl的方式是这样的:

set files [list] 
lappend files \ 
    error.log \ 
    ${datetime}${RECENT}.bwdb \ 
    ${txt}${testName}.txt \ 
    ${lancap}${testName}-lan.cap \ 
    ${lanmcap}${testName}-lan-m.cap \ 
    ${wancap}${testName}-wan.cap \ 
    ${wanmcap}${testName}-wan-m.cap \ 
    ${conf}${confFile}.conf \ 
    start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap \ 
    ${comments}comments-${RECENT}.bwc 
set f [open /path/to/file w] 
puts $f [join $files \n] 
close $f 
+0

非常感谢TCL提示。我在工作时只是被扔进了一个tcl项目,而我一直在自我教导自己,所以这些东西偶尔会出现。 – Joshua 2013-04-10 21:34:57

2

为什么不是简单的字符串?你知道一个"字符串可以跨越多行吗?

set f [open /p/t/f w] 
puts $f "error.log 
$datetume$RECENT.bwdb 
$txt$testName.txt 
$lancap$testName-lan.cap 
$lanmcap$testName-lan-m.cap 
$wancap$testName-wan.cap 
$wanmcap$testName-$wan.cap 
$conf$confFile.conf 
start.txt 
start-lan.cap 
start-lan-m.cap 
start-wan.cap 
start-wan-m.cap 
${comments}comments-$RECENT.bwc" 
close $f 

编辑:你不应该缩进跟进线,否则这会缩进结果文件中显示出来。
我个人通常使用模板文件,并使用subst来替换变量。

+0

我喜欢你的答案。 – kostix 2013-04-09 20:39:21