expect 与read -n 1

read -n 1 只允许输入一个字符;然后直接传参;

此时以read作为输入的shell脚本使用过expect免交互回应也应该是一个字符,然后呢,问题来了,expect一个字符输入后,不换行,不执行下一步;

经验证,此时expect send的内容需要多一给字符才能执行下一步,然后问题来了,这个多余的字符会往后串一行,也就是会影响下一行任务的执行,如果下一行也是read -n 作为输入,那就一路串下去了,全盘皆乱。。。

目前想到的是多返回一个空格(空格占半个字符)作为回应,应为我这边没有连续read -n 指定输入字符数,目前是好使的。

except返回换行(\r)或回车(\t)都可以结束一个read

exp_continue表示可以在expect语句内继续执行下一个判断

最后返回一个exit,避免如下报错:

expect: spawn id exp6 not open
  while executing
"expect eof"

 

expect默认等待时长为半分钟,set timeout -1可将默认等待时间设为无穷大,但目前实测似乎还没见效。

sleep时间取决于实际环境,如果sleep太短可能导致脚本内某些操作还没结束就直接开始下一项引起丢包现象,太长又浪费时间。

# cat ./expect.sh
#!/bin/bash

/usr/bin/expect <<-EOF
set timeout -1
spawn ./install.sh
expect {
"********Welcome to Install App**********" { send "1 ";sleep 0.5;exp_continue }  #此处输入为read -n 1
"Please input install full path <default /usr/local/app>:" {send "\r";sleep 0.5;exp_continue}   #此处为正常read输入
"The directory is not exist, do you want to create(y/n)?:" { send "y ";sleep 0.5;exp_continue } #此处read -n 1
"Please input server machine ip address:" {send "192.168.1.1\r";sleep 0.5;exp_continue}  #此处为正常read输入
"Please input local machine name <enter will not set>:" {send "\n";sleep 0.5;exit}   #此处为正常read输入
}
expect eof

EOF

 

posted @ 2023-03-10 10:15  咿呀哒喏  阅读(254)  评论(0)    收藏  举报