如何通过shell脚本中的命令行传递参数

时间:2013-06-12 07:14:04

标签: linux bash shell expect

我通过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 "$ "

但它不起作用。请帮我解决一下。

由于

6 个答案:

答案 0 :(得分:70)

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

来实现
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

答案 1 :(得分:5)

更好的方法可能是:

lassign $argv arg1 arg2 arg3

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我喜欢this guide附带的答案。 它创建了一个解析参数过程。

#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 arguements
puts -nonewline "username: $OPTS(username) password: $OPTS(password)"

上面只是一个片段。请务必通读本指南并添加足够的用户参数检查,这一点很重要。

答案 4 :(得分:-1)

请注意,有时argv 0是您要调用的脚本的名称。因此,如果你这样运行,argv 0不起作用,
对我来说,我跑 ">期待script.exp密码"

使argv 1 =密码 argv 0 = script.exp

答案 5 :(得分:-2)

带空格的Args很好,假设您想要的arg是脚本名称后面的第一个($0是脚本名称,$1是第一个arg等等。)

请务必使用"$ARG" NOT $ARG,因为它 NOT 包含空格,但会将它们分成单独的args。在bash脚本中执行此操作:

#!/bin/bash

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

expect -d exp.expect "$ARG"

exit 0

另外,如第一个答案所述,使用调试模式,(-d标志) 当argv看到它们时,它会输出您的expect变量,应该会告诉您发生了什么。