【问题标题】:I tried to press Ctrl D in script and I broke it?我试图在脚本中按 Ctrl D 但我把它弄坏了?
【发布时间】:2019-12-11 22:33:15
【问题描述】:

我编写了一个带有无限 while 循环的简单脚本来测试某些东西。这是脚本:

#!/bin/bash

while true; do
    echo -n "Give a number: "; read number
done

然后运行我的脚本,它仍在运行,我按了 Ctrl+D,它坏了! 这是输出:

user@DESKTOP:~$ ./test.sh
Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: Give a number: ^C

如何防止这种情况发生?谢谢...

【问题讨论】:

  • 预期的行为是什么?您想在按下 Ctrl+D 时退出循环(这是用户通常所期望的)还是继续阅读?
  • 是的,我想退出循环,然后回显一条消息,例如“按下了 ^D”。然后终止。

标签: linux bash signals


【解决方案1】:

您希望在读取失败时跳出循环:

read number || break;

当 read 检测到错误时,它返回非零值,在 shell 中为“false”。 || 将在左侧看到 false,因此继续评估右侧,但当 read 成功返回零时,|| 将不会评估右侧,从而允许循环继续。

【讨论】:

    【解决方案2】:

    解决这个问题的一个优雅方法是:

    while read -p 'Give a number: ' number; do
       ...
    done
    

    如果用户使用 Ctrl+D 关闭标准输入,则read 命令以非零状态退出,从而导致循环退出。 不需要额外的echo -nread 可以使用-p 选项自行提示。

    【讨论】:

    • 我不知道那样,我对此很陌生。谢谢!
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2017-06-02
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多