我是论坛的新手,所以如果这篇文章不正确,我很抱歉。
我的代码如下:
#!/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秒。
我希望你能理解我在这里说的话。
答案 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