暗无天日

=============>DarkSun的个人博客

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 ,这就导致了循环的不断进行。