read读取到空值之迷
今天犯了一个很想当然的错误。
在对银联前置系统做自动发布改造的时候,遇到一个脚本,类似于下面这样的菜单操作:
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
,这就导致了循环的不断进行。