キーを押すまで何かを出力します(ループ)。

キーを押すまで何かを出力します(ループ)。

ユーザーがQIを押して終了しようとしたときにストップウォッチを作成しようとしています。

2つのスクリプトが見つかりましたが、そのうちの1つは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

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

PS:私は非常にこれに慣れていません。

ベストアンサー1

おそらくこれはあなたに役立ちます。私はそれらを1つに統合しましたが、いくつかの修正を加えました。これが結果です。

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最初のスクリプトのコマンドを2番目のスクリプトに置き換えました。タイムアウトにはread遅延機能があります。-N最初のキーを押してからread待たずに反応するには、このオプションが必要です。Enter

おすすめ記事