我正在写一个期待的bash脚本 以下是剧本:
#!/bin/bash
set prompt 0
set bash_spawn_id $spawn_id
check_prompt(){
expect -c "
spawn telnet $IP $PORT1
set telnet_spawn_id $spawn_id
sleep 1
send \"\r\"
send \"\r\"
expect {
loader> {set spawn_id $bash_spawn_id ; set prompt 1;set spawn_id $telnet_spawn_id }
}
expect{
Login> {set spawn_id $bash_spawn_id ; set prompt 2;set spawn_id $telnet_spawn_id }
}
"
}
基本上check_prompt是我在bash脚本中调用的函数。当我打电话给某个提示时,如果我看到提示符为加载器>然后将bash变量提示设置为1,否则如果它看到Login>则将其设置为2。提示。为了进入bash上下文访问变量,我将设置适当的spawn_id来访问变量。 但我面临的错误是:
spawn telnet 1.2.1.7 2001
can't read "telnet_spawn_id": no such variable
while executing
"set telnet_spawn_id "
经过2个小时的挣扎,我终于可以实现我想要的了 感谢Eduardo的帮助。这是部分程序,您可以轻松地完成其余部分:
#!/bin/bash
check_prompt() {
expect -c "
log_user 0
spawn telnet $IP $PORT1
sleep 1
send \"\r\"
send \"\r\"
expect {
loader> {send_user \"1\" }
Login> {send_user \"2\"}
}
" > tempfile
read output < tempfile
echo $output
}
chk_prompt() {
check_prompt > prompt
read output < prompt
echo out=$output
}
基本上我可以重定向expect流程的输出,根据提示输出1或2。我通过将log_user
设置为零来抑制其他日志。休息是自我解释的:)
如果你们需要任何帮助,请告诉我们:)
答案 0 :(得分:1)
我不是期望的专家,但我很确定你应该使用标准语法如prompt=0
在bash中声明你的变量,而不是在bash中设置内部shell的set关键字选项。
您收到的错误消息有点误导,但我很想说$spawn_id
为空(因为您之前没有真正设置它,而仍然在bash中)有事情要做用它。