如何在期望脚本中的下划线之前立即使用变量?

How to use a veriable immediatly before an underscore in an expect script?

我正在尝试使用一个变量生成第二个变量。 但是,它将变量后面的下划线视为变量的一部分。 在这种情况下我如何强制它识别变量?

错误

can't read "v_host_": no such variable
    while executing
"set v_log_file "/some/loc/dir_$v_host_*/file.log""
    (file "./test.exp" line 3)

期望脚本:

#!/usr/bin/expect -f
...
set v_host [lindex $argv 0]
set v_log_file "/some/loc/dir_$v_host_*/file.log"

更新:复制了正确的错误信息。

我尝试了 concat 和 join,但由于某种原因它一直在添加空格。

我最终改用追加并从中得到了预期的结果。

使用追加:

#!/usr/bin/expect -f
...
set v_host [lindex $argv 0]
set v_log_file "/some/loc/dir_"
append v_log_file "$v_host" "_*/file.log"

结果:

/some/loc/dir_hostname_*/file.log

已更新 更正了 Peter Lewerin 发现的错字。

在你的文件中你实际上这样说:

set v_log_file "/some/log/dir_"$v_host"_*/file.log"

这不是合法的 Tcl 代码。如果您使用双引号,则需要将它们放在整个单词周围;这是 与 bash 不同的。相反,你这样做:

set v_log_file "/some/log/dir_${v_host}_*/file.log"

也就是说,用大括号括起变量名以将其与字符串的其余部分区分开来。或者您可以使用 append 零碎地构建字符串,其第一个参数是变量名(与 set 相同):

set v_log_file "/some/log/dir_"
append v_log_file $v_host
append v_log_file "_*/file.log"

两种方法都有效。 (我更喜欢这两种工作方法中的第一种,但是 YMMV。)