如何在期望脚本中的下划线之前立即使用变量?
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。)
我正在尝试使用一个变量生成第二个变量。 但是,它将变量后面的下划线视为变量的一部分。 在这种情况下我如何强制它识别变量?
错误
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。)