Shell脚本中完成交互输出输入自动化
比如原始的窗口需要输入回车,看到输出提示,再输入YES/NO或Y/N之类的选择,完成整个交互过程。现在实现的是,把这些交互过程都封装到一个脚本中,经由这个脚本,提前指定输入参数,然后自动化完成整个过程,实现交互的自动化。
推荐使用 expect
方式实现,这种实现方式,功能强大,可以处理任何类型的交互。
利用重定向
Here Document:将两个分隔符之间的内容作为输入传递给命令。优点是简单直观,缺点是不能处理复杂的交互逻辑。
以下的 test.sh 要求从 stdin 中分别输入 no, name,然后将输入的 no, name 打印出来。
1 | 查看test.sh内容 |
利用管道
管道是一种进程间通信的方式,它可以将一个进程的输出作为另一个进程的输入。例如,ls | cat -n > out.txt
。
管道的优点是:
- 简单,同时也符合Linux的哲学。
- 可以组合多个命令,实现复杂的功能。
管道的缺点是:
- 单向传输数据,如果需要双向传输需要创建两个管道。
- 效率低,不适合进程间频繁地交换数据。
- 只能在父子进程间通信。
管道:将一个命令的输出作为另一个命令的输入。优点是灵活方便,缺点是可能会遇到同步问题或缓冲区溢出。
利用管道特点,让前个命令的输出作为后个命令的输入。
1 | [root@localhost test]# echo -e "1\nlufbo\n" | ./test.sh |
上面的 "1\nlufbo\n"
中的 \n
是换行符的意思,这个比较简单。
利用expect
expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。例如,安装软件时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况。
expect的优点是:
- 可以实现和交互式程序如telnet服务器等进行交互的功能。
- 可以批量自动化处理任务,提高工作效率。
expect的缺点是:
- 需要安装额外的工具,可能会有兼容性或安全性问题。
- 需要学习tcl语言和expect语法,可能会有一定的学习成本。
expect:使用Tcl语言编写脚本,根据预期的输出发送相应的输入。优点是功能强大,可以处理任何类型的交互,缺点是需要安装额外的软件包和学习新的语言。
expect 是专门用来交互自动化的工具,但它有可能不是随系统就安装好的,有时需要自己手动安装该工具。
1 | [root@localhost test]# cat expect_test.sh |
注意: 第一行是 /usr/bin/expect,这个是选用解释器的意思,shell 一般选的是 /bin/bash,这里不是。
spawn: 指定需要将哪个命令自动化
expect: 需要等待的消息
send: 将要发送的命令
expect off: 申明命令交互结束
Shell脚本获取外部输入参数
上面已经解决了怎么封装Shell交互过程的问题,现在需要解决如何向Shell脚本传入外部参数,即实现交互输入参数可外部自定义。
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:**$n。n** 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……。
以下实例向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):
1 | !/bin/bash |
为脚本设置可执行权限,并执行脚本,输出结果如下所示:
1 | chmod +x test.sh |