输出一些东西(在循环中)直到按下一个键

gel*_*gel 7 shell-script

我正在尝试制作秒表,当用户按下 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并立即做出反应。