2016-03-24 57 views
0

我在下面工作預計代碼:如何理解以下輸出?

#!/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 } 

我已閱讀在期望有一個列表存儲參數的文檔中,但我的問題是爲什麼如果我將argv0設置爲字符串:「這是第一個ARG」,然後在輸出中打印:

arg.exp {THIS IS THE FIRST ARG } 

這讓我覺得argv0仍是腳本的默認名稱,我想體會做任何解釋,以及如何由預期的args來列表。

+0

你在哪裏「在代碼中設置argv0爲字符串」? –

+0

在這一行:設置字符串[lindex $ argv 0] – neo33

+0

這是分配給變量'字符串'不分配給'argv0'。 –

回答

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 } 
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