如何理解以下输出?

时间:2016-03-24 02:48:59

标签: expect

我正在使用以下期望代码:

#!/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列表。

2 个答案:

答案 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 }
相关问题