カウントダウンタイマーの作成方法

カウントダウンタイマーの作成方法

20 secカウントダウンタイマーをから降順に表示する必要があります。00 sec

20秒以内にパスワードを入力できない場合は、メッセージで終了します。君の時間は終わった

出力:

you have 20 sec to enter password :
you have 15 sec to enter password :
you have 10 sec to enter password :
you have 00 sec to enter password :

メッセージを表示する作業コードの一部

read -t 20 -p 'Enter your password : ' 
status=$?   
if [ $status -eq 142 ]
then
    echo "your time is over"
fi

ベストアンサー1

誰かがより良い解決策を見つけるまで:

#!/bin/bash

tmout=20

(
        while [[ $tmout -gt 0 ]]; do
                printf '\rPlease respond within %02d seconds: ' "$tmout" >&2
                sleep 1
                tmout=$(( tmout - 1 ))
        done
) & prompt_pid=$!

read -s -t "$tmout"
read_ok=$?
echo ''

if [[ $read_ok -eq 0 ]]; then
        kill "$prompt_pid"
        printf 'You responded with "%s"\n' "$REPLY"
else
        echo 'You did not respond in time'
fi

$tmoutこれにより、数秒間または終了するまで毎秒プロンプトを更新するバックグラウンドジョブが開始されます。プロンプトテキストの前にキャリッジリターン文字があります\r\rを使用して出力すると、カーソルはprintf行の先頭に戻ります。つまり、文字列の残りの部分が以前に出力されたテキストを上書きし、カチカチしているカウンターのように見えます。出力テキスト文字列がprintf常に同じ長さになるように、意図的にゼロで埋められた2桁の整数をカウンタとして使用します(少なくとも$tmout100未満の値の場合)。

その後、フォアグラウンド操作はタイムアウトを使用して$tmoutユーザー入力を数秒待ちます。readここではパスワードを読むために-s使用しreadます(これは入力した内容が表示されず、出力プロンプトによって複雑にならないという意味でもあります)。

返却時にreadプロンプ​​トループを終了し(まだ実行中の場合)、終了readした方法に従ってメッセージを印刷します。

おすすめ記事