Вывести что-нибудь (в цикле), пока не будет нажата клавиша

find . -type f | awk -F / '{a[$2]=a[$2] " " $0}; END {for(b in a){print a[b]}}'
6
07.10.2016, 00:02
3 ответа

Может быть, это вам поможет. Я интегрировал их оба, правда, с небольшими изменениями. Вот результат.

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

Как видите, я поместил второй сценарий вместо команды sleep в предыдущем первом. Тайм-аут в , чтение теперь имеет функцию замедленной съемки. Обратите внимание, что параметр -N необходим для чтения , чтобы не ждать , введите и реагировать, как только будет нажата первая клавиша.

10
27.01.2020, 20:27

На основе этого ответа вы можете использовать читать с параметром -t , так что он ждет только определенное время, а не бесконечно. В приведенном ниже коде объединены два опубликованных вами фрагмента:

#!/bin/bash

begin=$(date +%s)
echo "Starting Stopwatch... Press q to exit"
while true; do
   now=$(date +%s)
   diff=$(($now - $begin))
   mins=$(($diff / 60))
   secs=$(($diff % 60))
   hours=$(($diff / 3600))
   days=$(($diff / 86400))

   # \r  is a "carriage return" - returns cursor to start of line
   # with \33[2K we clear the current line
   printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs

   # -n 1 to get one character at a time, -t 0.1 to set a timeout 
   read -n 1 -t 0.1 input                  # so read doesn't hang
   if [[ $input = "q" ]] || [[ $input = "Q" ]] 
   then
      echo # to get a newline after quitting
      break
   fi
done
1
27.01.2020, 20:27

Я предпочитаю более лаконичный until...

until read -s -n 1 -t 0.01; do 
    echo -n "."
    sleep.5
    done 
echo 

Единственной незначительной проблемой является отображение одного символа.

1
30.09.2021, 21:11

Теги

Похожие вопросы