bugfix> bash > 投稿

からの降順カウントダウンタイマーを表示する必要があります 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

回答 2 件
  • 誰かがより良い解決策を思い付くまで:

    #!/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
    
    

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

    次に、フォアグラウンドジョブが待機します $tmout を使用したユーザーからの入力の秒数 read タイムアウト付き。使っています -sread ここでは、パスワードを読み取っています(これは、入力されている内容が表示されず、出力されたプロンプトによって混乱しないことも意味します)。

    一度 read が返されます。プロンプトループがまだ実行されている場合は必ず強制終了し、方法に応じてメッセージを出力します。 read 終了しました。

  • これがスニペットです;00秒に達すると、さらに5秒待機します。これが必要な動作であるかどうかわからないため、条件付きで編集できます。

    #!/bin/bash
    c1=5
    c2=4
    count=20
    status=''
    while [[ "$count" != 0 ]]   
        do
            count="$(expr $c1 \* $c2)"
            c2="$(expr $c2 \- 1)"
            read -t 5 -p  "You have $count sec to enter your password : "$'\n'
            status=$?
            if [ "$status" -ne 142 ] ; then
              break
            fi
    done
    if [ "$status" -eq 142 ]
    then
        echo "Your time is over"
        
    else 
       echo "Success"
    fi
    
    

    ###編集###

    出力1:

    [root@host~]# ./lol.sh
    You have 20 sec to enter your password :
    You have 15 sec to enter your password :
    You have 10 sec to enter your password :
    You have 5 sec to enter your password :
    You have 0 sec to enter your password :
    Your time is over
    
    

    出力2:

    [root@host~]# ./lol.sh
    You have 20 sec to enter your password :
    LOL
    Success
    [root@host~]#
    
    

    ##コメントで提案されているように2つのよりグローバルなソリューションを編集します##:

    これでは、カウンターは正確に20秒です。あなたになら変えられるtmt&wait_secあなたの都合の良い定数。

    #!/bin/bash
    ##CALCULATTION :
    ##TIMEOUT=WAIT_SECONDS * NB_ITERATIONS 
    ##TIMEOUT modulo WAIT_SECONDS should  equal to 0 to get a fixed iterations number
    # 20  =   5 * 4 
    wait_sec=5
    tmt=20
    modulo_ok=1
    fpr=1
    count="$tmt"
    # Modulo Test
    if [[ "$(($tmt % $wait_sec))" -eq 0 ]]; then
        nb_iters="$(expr $tmt \/ $wait_sec)"
        modulo_ok=0
    fi
    if [[ "modulo_ok" -eq 0 ]]; then
        (while [[ "$count" != 0 ]] && [[ "$fpr" -gt 0 ]]
            do
                count="$(expr $wait_sec \* $nb_iters)"
                nb_iters="$(expr $nb_iters \- 1)"
                echo "You have $count sec to enter your password :" 
                ps -p "$pid" &> /dev/null 
                sleep $wait_sec
        done
        ) &  fpr=$?  
        bpr=$!
        read -t "$tmt" -s pass
        kill $bpr > /dev/null 2>&1 
        if [[ -z  "$pass" ]]
        then
            echo "Your time is over"
        else 
           echo "Success"
           echo "Your password is : $pass"
        fi 
    else 
        echo 'Timeout modulo Wait seconds should be equal to 0'
    fi
    
    

    出力3:ケース->tmt間隔中に設定されたパスワード

    [root@host~]# ./lol2.sh
    You have 20 sec to enter your password :
    You have 15 sec to enter your password :
    Success
    Your password is : Reda
    
    

    出力4:ケース->タイムアウト

    [root@host~]# ./lol2.sh
    You have 20 sec to enter your password :
    You have 15 sec to enter your password :
    You have 10 sec to enter your password :
    You have 5 sec to enter your password :
    Your time is over
    
    

    出力5:ケース->tmt%wait_secが0と異なります

    [root@host~]# ./lol2.sh
    Timeout modulo Wait seconds should be equal to 0
    
    

あなたの答え