2

read读取到空值之迷

 2 years ago
source link: https://www.lujun9972.win/blog/2018/06/20/read%E8%AF%BB%E5%8F%96%E5%88%B0%E7%A9%BA%E5%80%BC%E4%B9%8B%E8%BF%B7/index.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK