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桁の整数をカウンタとして使用します(少なくとも$tmout
100未満の値の場合)。
その後、フォアグラウンド操作はタイムアウトを使用して$tmout
ユーザー入力を数秒待ちます。read
ここではパスワードを読むために-s
使用しread
ます(これは入力した内容が表示されず、出力プロンプトによって複雑にならないという意味でもあります)。
返却時にread
プロンプトループを終了し(まだ実行中の場合)、終了read
した方法に従ってメッセージを印刷します。