在Shell中,很多交互式场景:比如删除文件需要输入确认,登录远程服务器需要输入账号密码,登录Mysql数据库等场景......这个时候,可供选择的方案,其实有两个,一个使用here document来嵌套,另外一个使用expect。
expect是tcl语言中的语法:
- expect 负责匹配,可以使用-r 或 -re 来进行正则匹配
- send 负责发送命令
- spawn负责发起一个会话,启动一个进程等
下面是一个简单的示例: 在交互式场景下,删除一个文件
#!/usr/bin/tclsh
package require Expect
spawn rm -i OneFile
expect "rm: remove"
send "y\r"
expect eof
exit
- 首行: shebang,是告诉解析器,这里使用的tclsh
- package require Expect # 则是要导入expect的包
- spawn rm -i OneFile # 启动一个进程,删除文件的进程
- expect "rm: remove" # 如果匹配到这样的关键字的话
- send "y\r" # 则发送字符y并按回车键
- expect eof # 结束expect
- exit # 退出主程序
上面其实就是一个简单的expect的应用场景。 expect比较常用的写法是下面这种,用正则匹配多个,发送多条命令,如果是需要循环匹配的话,send命令后填加一条exp_continue
expect {
-re "keyword1" { send "cmd1\r" }
-re "keyword2" { send "cmd2\r" }
-re "keyword3" { send "cmd3\r"; exp_continue }
}