Shell脚本:如何在超时时读取输入,但在按下enter时不能继续?

时间:2014-02-22 02:59:35

标签: macos bash shell input terminal

我是论坛的新手,所以如果这篇文章不正确,我很抱歉。

我的代码如下:

#!/bin/bash

number=0

while (true); do
echo "Your number is: $number"
echo ""
echo "Press space to add one to your number."
echo ""
read -t 1 -n 1 input

if [ "$input" == " " ]; then
    number=$((number+1))
fi
done

我想这样做,以便该人不能只按住空格键来增加数字。有没有办法可以让人们在超时完成后按空格键?

换句话说,如果你在0.25秒内输入一个键,你就不会跳到下一步,程序会再等0.75秒才能继续,这样总共需要1秒。 / p>

就像你在没有read的正常-n 1命令中按Enter键提交输入一样,即使超时没有完成,它也会继续。另一种方法是在读取用户输入时进入睡眠状态,并在睡眠完成后终止它。

我也试过这个:

read -n 1 input & sleep 1 & wait

然后弹出:

[15] 94977
[16] 94978

[15]+  Stopped                 read -n 1 input
[16]   Done                    sleep 1

当它应该同时运行时,为什么它会停止进程?以下代码同时运行所有三个:

sleep 1 & sleep 2 & sleep 3 & wait

总共睡眠时间为3秒,而不是6秒。

我希望你能理解我在这里说的话。

3 个答案:

答案 0 :(得分:0)

不要把“& sleep” 把睡眠放在一个新的线上

read -n 1 -t 1 input sleep 1

答案 1 :(得分:0)

你怎么看?

你可以尝试(作为我的朋友@jaypal指南):

#!/bin/bash

number=0
while (true); do
    echo "Your number is: $number"
    IFS= read -t 5 -n 1 -p "Press space to add one to your number: " input
    # Check for Space
    if [[ $input =~ \ + ]]; then
       echo "space found"
       let number=number+1
       echo "$number"
    # Check if input is NULL
    elif [[ -z "$input" ]]; then
       echo "input is NULL"
    fi
done

bash中,read有一个-t选项,您可以在其中指定超时。从联机帮助页:

  

read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]

     

-t timeout:如果在超时秒内未读取完整的输入行,则会导致读取超时并返回失败。如果读取不是从终端或管道读取输入,则此选项无效。

下面的成绩单(没有点击 ENTER ):

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:29:15 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:29:25 WAST 2012

另一个,几秒后点击 ENTER

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; date
Tue Feb 28 22:30:17 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:30:19 WAST 2012

另一个,点击 CTRL + C

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:30:29 WAST 2012
Hit ENTER or wait ten seconds

答案 2 :(得分:0)

试试这个!

变化:read -n 1 input & sleep 1 & wait

此:read -n 1 input && sleep 1

原因是&将在后台运行程序/命令。和&&将在最后一个程序/命令完成后运行,并且只有在退出时错误状态为1(成功执行),或者您也可以使用;这将告诉它在最后一个程序/命令之后运行并关心退出状态。如果可能的话,我也建议使用usleep而不是sleep,如果它安装了相同的语法,但它将是微秒而不是秒。 usleep 1000 = sleep 1