75

我通过 shell 脚本中的命令行在 Expect 中传递参数。

我试过这个

#!/usr/bin/expect -f
    
set arg1 [lindex $argv 0]
    
spawn lockdis -p
expect "password:" {send "$arg1\r"}
expect "password:" {send "$arg1\r"}
expect "$ "

但它不起作用。我该如何解决?

4

6 回答 6

112

如果你想从参数中读取,你可以简单地通过

set username [lindex $argv 0];
set password [lindex $argv 1];

并打印出来

send_user "$username $password"

该脚本将打印

$ ./test.exp user1 pass1
user1 pass1

您可以使用调试模式

$ ./test.exp -d user1 pass1
于 2013-06-12T07:43:59.060 回答
8

更好的方法可能是这样的:

lassign $argv arg1 arg2 arg3

但是,您的方法也应该有效。检查是否arg1已检索。例如,与send_user "arg1: $arg1\n".

于 2013-06-12T07:59:53.950 回答
3

我喜欢本指南提供的答案。

它创建了一个解析参数过程。

#process to parse command line arguments into OPTS array
proc parseargs {argc argv} {
    global OPTS
    foreach {key val} $argv {
        switch -exact -- $key {
            "-username"   { set OPTS(username)   $val }
            "-password"   { set OPTS(password)   $val }
        }
    }
}
parseargs $argc $argv
#print out parsed username and password arguments
puts -nonewline "username: $OPTS(username) password: $OPTS(password)"

以上只是一个片段。完整阅读指南并添加足够的用户参数检查非常重要。

于 2019-01-11T11:20:46.857 回答
3
#!/usr/bin/expect
set username [lindex $argv 0]
set password [lindex $argv 1]
log_file -a "/tmp/expect.log"
set timeout 600
spawn /anyscript.sh
expect "username: " { send "$username\r" }
expect "password: " { send "$password\r" }
interact
于 2017-12-12T06:24:15.183 回答
-2

请注意,有时 argv 0 是您正在调用的脚本的名称。因此,如果您以这种方式运行,则 argv 0 不起作用。

对我来说,我跑

expect script.exp  password

这使得 argv 1 = 密码和 argv 0 = script.exp。

于 2016-11-30T02:28:19.533 回答
-3

带空格的参数很好,假设您想要的参数是脚本名称之后的第一个($0是脚本名称,$1是第一个参数等)

确保使用"$ARG"而不是 $ARG因为它包含空格,而是将它们分解为单独的参数。在您的 Bash 脚本中执行此操作:

#!/bin/bash

ARG="$1"
echo WORD FROM BASH IS: "$ARG" #test for debugging

expect -d exp.expect "$ARG"

exit 0

此外,作为第一个答案状态,使用调试模式,(-d标志)。它会在 Expect 看到的时候输出你的argv变量,并且应该告诉你发生了什么。

于 2017-05-02T03:06:12.727 回答