首页 > 解决方案 > 如何在秒表中同时使用 read 和 while

问题描述

我决定制作一个简单的秒表,并在源代码中找到了这段代码,stackowerflow但我在读取命令时遇到了问题。如何使秒表与输入(读取)同时工作?所以秒表显示时间,但稍微低一点是进入的邀请。

START=$(date +%s)

while true; do
        NOW=$(date +%s)
        DIFF=$(( $NOW - $START ))
        SECS=$(( $DIFF % 60 ))
        MIN=$(( $DIFF / 60 ))
        HOURS=$(( $DIFF / 3600 ))

        printf "\r%02d:%02d:%02d" $HOURS $MIN $SECS
        sleep 1

        read -p "Stop/Reset -> " INT
done

此代码显示 1 秒,然后要求输入Stop/Reset ->,但如何使秒表继续工作。有任何想法吗?谢谢

标签: bash

解决方案


只需使用-t读取选项。像这样

START=$(date +%s)

while true; do
        NOW=$(date +%s)
        DIFF=$(( $NOW - $START ))
        SECS=$(( $DIFF % 60 ))
        MIN=$(( $DIFF / 60 ))
        HOURS=$(( $DIFF / 3600 ))

        printf "\r%02d:%02d:%02d" $HOURS $MIN $SECS

        # -t 1 wait at max 1 second for a key to be pressed
        # -n 1 only expect one character (no enter required)
        read -t 1 -n 1 -p "Stop/Reset -> " ANS
        if [[ "${ANS}" == "s" ]] ; then
           break
        fi
        if [[ "${ANS}" == "r" ]] ; then
           START=$(date +%s)
        fi
done

推荐阅读