按任意键可在5秒内中止

时间:2015-12-24 20:57:07

标签: bash user-input

您好我试图实施一个在5秒倒计时后发生的事件,除非按下某个键。我一直在使用这段代码,但是如果按下回车键或空格键就会失败。它在输入或空间被检测为""。

的意义上失败了
echo "Phoning home..."
key=""
read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key
echo
if [ "$key" = "" ]     # No Keypress detected, phone home.
     then python /home/myuser/bin/phonehome.py
     else echo "Aborting."
fi

阅读这篇文章后, Bash: Check if enter was pressed

我放弃了,发布在这里。我觉得必须有比我试图实施的更好的方式。

2 个答案:

答案 0 :(得分:4)

read手册说:

  

read的返回码为零,除非遇到文件结尾   或读出超时。

在您的情况下,当用户在允许的时间内点击任何键时,您希望中​​止继续。

#!/bin/bash
if read -r -s -n 1 -t 5 -p "TEST:" key #key in a sense has no use at all
then
    echo "aborted"
else
    echo "continued"
fi

<强>参考: Read Manual
注意: 引文的重点是我的。

答案 1 :(得分:2)

accepted answer中的linked question涵盖问题的“检测enter”组件。您可以查看read的退出代码。

关于处理空间,有两个答案。

空间问题是在正常情况下read在将输入分配给给定变量时修剪输入的前导和尾随空格(以及对输入进行分词)。

有两种方法可以避免这种情况。

  1. 您可以避免使用自定义命名变量,而是使用$REPLY。分配给$REPLY时,不执行空格修剪或分词。 (虽然现在正在寻找这个我在POSIX规范中实际上找不到这个,所以这可能是某种非标准和/或非便携式扩展。)

  2. IFS显式设置为read命令的空字符串,使其不执行并进行空格修剪或分词。

    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $?
    # Press <space>
    0
    $ declare -p key
    declare -- k=" "
    $ unset -v k
    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $?
    # Wait
    1
    $ declare -p key
    -bash: declare: k: not found