最近开发的一个项目但愿实现这样一个功能。将本地项目建立脚手架置于远程服务器,而用户须要建立项目时,仅须要在提供的页面上填入一些项目基础配置并提交,后台便会根据选择自动化建立项目并push上仓库。
咋看是个很是简单的需求,咱们仅须要在用户发起建立请求时在后端调取shell脚本并能够实现这一系列的操做。
然而目前项目建立脚手架不支持多参数传递,只能经过用户输入完成各参数传递的操做。
因而抛出本文的主角:Expect,以实现一系列的自动化交互动做。html
expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。在实际工做中,咱们运行命令、脚本或程序时,这些命令、脚本或程序都须要从终端输入某些继续运行的指令,而这些输入都须要人为的手工进行。而利用expect,则能够根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。这就是expect!!!shell
使用expect时,首先须要在文件顶部写入#!/usr/bin/expect
,已告知进程这是一个expect
文件。而在脚本书写中基本离不开如下这「六」个命令。编程
spawn
启动新的进程expect
用来等待一个进程的反馈,咱们根据进程的反馈,再发送对应的交互命send
发送须要交互的值,替代了用户手动输入内容set
设置变量值expect eof
自动化结束interact
退出自动化,进入人工交互expect使用的是tcl语法,详细教程可查阅TCL基本语法 - Tcl教程
这里提供几个简单的流程控制,通常来讲已经够用了。后端
expect参数值存放在$argv
中,好比取第一个参数就是[lindex $argv 0]
,以此类推。服务器
// 执行命令 xxx.sh mike 22 engineer #!/usr/bin/expect set name = [lindex $argv 0] set age = [lindex $argv 1] set job = [lindex $argv 2]
if {$a == 'a'} { set flag = 0 } else { set flag = 1 } expect '*请输入xxx的值*' send $flag
通常来讲expect匹配成功会会退出语句,而exp_continue
表示循环匹配。匹配到改关键字后继续从头开始匹配。例如安装软件时须要输入多个 yes。yii
expect { "*yes/no*" { send "yes" exp_continue } eof { send "eof" } }
未完待续 工具