今天犯了一个很想当然的错误。
在对银联前置系统做自动发布改造的时候,遇到一个脚本,类似于下面这样的菜单操作:
while :
do
cat<<EOF
1) 登出
2) 登录
3) 停止应用
4) 启动应用
EOF
read choice
case $choice in
1)
echo "登出"
;;
2)
echo "登录"
;;
3)
echo "停止应用"
;;
4)
echo "启动应用"
;;
99)
break
;;
esac
done
我要在自动发布的脚本中调用这个菜单中的某些功能。 由于操作比较繁琐,我想着一步一步的重定向输入内容到这个菜单脚本中,于是我试着运行了一下
echo "1" |menu.sh
我本来以为系统会登出后,停在主菜单处,但是结果却发现系统登出后,不断地开始循环输出主菜单的内容。 经过调试,发现菜单中的read操作,除了第一次读取到”1”以外,后面每次read并没有如我意想中的那样卡在那里等待输入,而是不断的读取到了空值。
不过仔细一想其实原因很容易理解。 在上面的命令中,menu.sh的输入与 echo "1"= 的输出相连接,而 =echo "1"= 在输出一个 =1
之后就退出了,因此menu.sh的输入实际上被关闭了,导致每次read实际上都读取到一个 EOF
.
而在主循环中,并没有对 choice
的异常值进行判断处理,而只是单纯的进入下一个循环,而下一个循环中的read还是读出一个 EOF
,这就导致了循环的不断进行。