通过shell函数期望函数参数:在shell脚本中调用

时间:2016-03-08 11:26:34

标签: shell sh expect

我有一个名为test.sh的脚本。

包含函数as,

APPFE_Routes()
{


set filename [lindex $argv 0]

expect -c '

spawn ssh admin@10.43.67.18

expect "Password: "

send "Admin@1234\r"

expect "~]$"

send "su\r"

expect "Password: "

send "500tps\r"

expect "]#"

send "put ifconfig grep -i $filename\r"

expect -re "]#"

send "exit\r"

'

}

我在test.sh脚本中调用它。

APPFE_Routes mkt mkt1

我希望这些mktmkt1变量通过expect脚本函数 通过上面的代码。

我无法得到相同的结果。 其实我将这些变量从一个文件转换为shell,然后需要传递给shell中的期望函数。 不需要单独的期望脚本。 解决方案非常受欢迎。

3 个答案:

答案 0 :(得分:1)

我打算建议你做

shell_func() {
    expect -c '
        your expect code
    ' "$@"
}

但期望在-c

之后无法处理阅读参数
$ expect -c 'puts [join $argv \n]' foo bar baz
can't read "argv": no such variable
    while executing
"join $argv \n"
    invoked from within
"puts [join $argv \n]"
couldn't read file "foo": no such file or directory

所以我建议你把shell函数的参数放在期望的环境中:

APPFE_Routes()
{
    FILENAME="$1" expect -c '
        puts "hello $env(FILENAME)"
    '
}
APPFE_Routes world
hello world

答案 1 :(得分:0)

好像你正在编写TCL代码。如果您安装了tclsh,那么您可以将shebang设置为#!/ usr / bin / tclsh,然后根据需要编写TCL。

如果你想坚持使用POSIX shell代码,那么set语句可能应该是:

filename="$1"

答案 2 :(得分:0)

嗨glenn jackman和ALL,

感谢您的所有回复。在大家的帮助下完成了我的工作。 但我做了别的事来避免这个问题。 code APPFE_IP = $ {lines_ary [I]};

SIG_IP = $ {lines_ary第[i + 1]};

SIG_Gateway = $ {lines_ary第[i + 2]};

APP_IP = $ {lines_ary第[i + 3]};

APP_GATEWAY = $ {lines_ary第[i + 4]};

RDS1_IP = $ {lines_ary第[i + 5]};

RDS1_APP = $ {lines_ary第[i + 6]};

RDS1_GATEWAY = $ {lines_ary第[i + 7]};

网络连接

###### APPFE路由到RDS1

{

/ usr / bin / expect<< EOF

spawn ssh admin @ $ APPFE_IP

期待“密码:”

发送“Admin @ 1234 \ r”

期待-re“〜] $”

发送“su - \ r”

期待“密码:”

发送“500tps \ r”

期待-re“〜]#”

发送“route add -host $ RDS1_APP gw $ APP_GATEWAY \ r”

期待-re“〜]#”

发送“exit \ r”

EOF

}

code