我正在尝试制作秒表,当用户按下 QI 想要退出时。
我找到了两个脚本,一个在按下 ctrl + z 之前显示时钟。还有一个脚本,如果按下“q”就会退出。
我试图将它们结合起来,但“阅读”似乎把这一切都搞砸了。
我想要实现这一点的原因是,如果用户按 Q,经过的时间将被保存到一个文件中。
跑表:
BEGIN=$(date +%s)
echo Starting Stopwatch...
while true; do
NOW=$(date +%s)
let DIFF=$(($NOW - $BEGIN))
let MINS=$(($DIFF / 60))
let SECS=$(($DIFF % 60))
let HOURS=$(($DIFF / 3600))
let DAYS=$(($DIFF / 86400))
# \r is a "carriage return" - returns cursor to start of line
printf "\r%3d Days, %02d:%02d:%02d" $DAYS $HOURS $MINS $SECS
sleep 0.25
done
Run Code Online (Sandbox Code Playgroud)
在 q 上退出:
while true; do
echo -en "Press Q to exit \t\t: "
read input
if [[ $input = "q" ]] || [[ $input = "Q" ]]
then break
else
echo "Invalid Input."
fi
done
Run Code Online (Sandbox Code Playgroud)
PS:我对此很陌生。
小智 10
也许这对你有帮助。我整合了它们,但稍作修改。结果如下。
BEGIN=$(date +%s)
echo Starting Stopwatch...
echo Press Q to exit.
while true; do
NOW=$(date +%s)
let DIFF=$(($NOW - $BEGIN))
let MINS=$(($DIFF / 60))
let SECS=$(($DIFF % 60))
let HOURS=$(($DIFF / 3600))
let DAYS=$(($DIFF / 86400))
# \r is a "carriage return" - returns cursor to start of line
printf "\r%3d Days, %02d:%02d:%02d" $DAYS $HOURS $MINS $SECS
# In the following line -t for timeout, -N for just 1 character
read -t 0.25 -N 1 input
if [[ $input = "q" ]] || [[ $input = "Q" ]]; then
# The following line is for the prompt to appear on a new line.
echo
break
fi
done
Run Code Online (Sandbox Code Playgroud)
如您所见,我将第二个脚本替换为sleep前一个脚本中的命令。read现在的超时带有延时功能。请注意,该-N选项需要在按下第一个键后read不等待Enter并立即做出反应。