我正在使用以下期望代码:
#!/usr/bin/expect
set string [lindex $argv 0]
send ${string}
send_user "$argv0 [lrange $argv 0 2]\n"
我按照这样运行这个脚本:
newProves/expect$ expect arg.exp "THIS IS THE FIRST ARG "
我得到以下输出:
THIS IS THE FIRST ARG arg.exp {THIS IS THE FIRST ARG }
我在文档中读到了期望有一个存储args的列表,但我的问题是为什么如果我将argv0设置为字符串:"这是第一个ARG",然后在输出打印:
arg.exp {THIS IS THE FIRST ARG }
这让我觉得argv0仍然是脚本的默认名称,我想感谢对此的任何解释,以及如何组成期望的args列表。
答案 0 :(得分:1)
来自字符串化列表的额外括号。 lrange
命令返回一个列表。该列表的第一个元素是一个包含空格的字符串,因此当该列表被字符串化时,Tcl会将该元素括在大括号中:
% set argv [list "This is the first arg " second_arg_with_no_whitespace]
% puts "hello [lrange $argv 0 end]"
hello {This is the first arg } second_arg_with_no_whitespace
解决方法是自己将该列表转换为字符串:
% puts "hello [join [lrange $argv 0 end] " "]"
hello This is the first arg second_arg_with_no_whitespace
答案 1 :(得分:0)
您不必在脚本中的任何位置设置argv0
。
Expect将它设置为脚本名称。
您可以在expect -d
输出中看到这一点:
$ cat arg.exp
#!/usr/bin/expect
set string [lindex $argv 0]
send ${string}
send_user "$argv0 [lrange $argv 0 2]\n"
$ expect -d arg.exp "THIS IS THE FIRST ARG "
expect version 5.45
argv[0] = expect argv[1] = -d argv[2] = arg.exp argv[3] = THIS IS THE FIRST ARG
set argc 1
set argv0 "arg.exp" # <-- This line sets `argv0` for expect.
set argv "{THIS IS THE FIRST ARG }"
executing commands from command file arg.exp
send: sending "THIS IS THE FIRST ARG " to { exp0 THIS IS THE FIRST ARG }
arg.exp {THIS IS THE FIRST ARG }