How to pass argument in Expect through the command line in a shell script
LinuxBashShellExpectLinux Problem Overview
I am passing argument in Expect through the command line in a shell script.
I tried this
#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
spawn lockdis -p
expect "password:" {send "$arg1\r"}
expect "password:" {send "$arg1\r"}
expect "$ "
But it's not working. How can I fix it?
Linux Solutions
Solution 1 - Linux
If you want to read from arguments, you can achieve this simply by
set username [lindex $argv 0];
set password [lindex $argv 1];
And print it
send_user "$username $password"
That script will print
$ ./test.exp user1 pass1
user1 pass1
You can use Debug mode
$ ./test.exp -d user1 pass1
Solution 2 - Linux
A better way might be this:
lassign $argv arg1 arg2 arg3
However, your method should work as well. Check that arg1
is retrieved. For example, with send_user "arg1: $arg1\n"
.
Solution 3 - Linux
I like the answer provided with this guide.
It creates a parse argument process.
#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)"
The above is just a snippet. It's important to read through the guide in full and add sufficient user argument checks.
Solution 4 - Linux
#!/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
Solution 5 - Linux
Note, sometimes argv 0 is the name of the script you are calling. So if you run it that way, argv 0 doesn't work.
For me I run
expect script.exp password
That makes argv 1 = password and argv 0 = script.exp.
Solution 6 - Linux
Arguments with spaces are fine, assuming the argument you want is the first after the script name ($0
is script name, $1
is the first argument, etc.)
Make sure you use "$ARG"
, not $ARG
as it will not include the whitespace, but break them up into individual arguments. Do this in your Bash script:
#!/bin/bash
ARG="$1"
echo WORD FROM BASH IS: "$ARG" #test for debugging
expect -d exp.expect "$ARG"
exit 0
Also, as the first answer states, use debug mode, (the -d
flag). It will output your argv
variables as Expect sees them and should show you what is going on.