在日常编写shell脚本时,我们通过需要读取交互输入的数据来控制程序运行。但是当用户输入的这些数据是固定的时候我们可以使这种半自动交互执行方式变成自动执行。
首先写一个交互式输入的脚本:
#!/bin/bash/
# filename:interactive.sh
read -p "Enter your name :" Name;
read -p "Enter your age: " Age
read -p "Enter your fav: " Fav
echo You hava entered $Name , $Age, $Fav
可以按照以下方式命令自动发送输入:
$ echo -e "Jim\n18\nfootball\n" | ./interactive.sh
$ You hava entered Jim , 18, football
就这样输入生效了,如果执行 ./interactive.sh 就要分三步输入Jim , 18, football
使用echo -e 可以生成输入序列,如果输入的内容比较多,那么可以通过先输入文件再用重定向的方式提供输入,如下:
$ echo -e "Jim\n18\nfootball\n" > input.data
$ cat input.data
$ Jim
$ 18
$ football
然后通过文件来进行输入重定向
$ ./interactive.sh < input.data
$ You hava entered Jim , 18, football
主要直接通过文件导入交互式输入数据, 有时也可以通过这种方式来输入键盘无法输入的有些键值
有时候手动配置的input.data 交互数据的输入文件可能就会包含一些多余的字符,例如 \r ,这个时候我们就要先格式化一下
$ echo -e "Jim\n18\nfootball\n" > tmp
$ tr -d "\r" < tmp > input.data
$ ./interactive.sh < input.data
主要就可以保证输入数据正确性。
另外一种方式是通过配置文件生成交互输入文件
grep -v '^#' $INIFILE | awk -F '=' '{if($1 ~ /^USB_BIN_/) print $2}' > tmp.ini // 将配置文件中的配置项生成输入数据,前缀可以自行定义,通过awk的第一个域来来过滤
tr -d "\r" < tmp.ini > input.data // 去掉输入文件中多余的字符 '\r'
./interactive.sh < input.data
还有一种方式是使用expect来完成这种交互式输入。