Bash - 特定のキーを使用してスクリプトを一時停止および再開する(forループ)

Bash - 特定のキーを使用してスクリプトを一時停止および再開する(forループ)

私のスクリプトでは、次のカウンタ関数を使用しています。

for ((i=1; i <= 100; i++ )); do
    printf "\r%s - %s" "$i" $(( 100 - i ))
    sleep 0.25
done

キーボード入力でカウンタを一時停止して再開する方法はありますか?
(同じキーを使用することをお勧めします。use space

ベストアンサー1

readタイムアウトを使用し-t、その出力に従って変数を設定します。

#!/bin/bash

running=true

for ((i=1; i <= 100; i++ )); do
    if [[ "$running" == "true" ]]; then
        printf "\r%s - %s" "$i" $(( 100 - i ))
    fi

    if read -sn 1 -t 0.25; then
        if [[ "$running" == "true" ]]; then
            running=false
        else 
            running=true
        fi
    fi
done

これにより、任意のキーを押してスクリプトを一時停止または一時停止を解除できます。

runningループが機能するかどうかを判断するためにtrueまたはfalseを保存します。read -sn 1 -t 0.25キーを押すと文字が読み取られ、-n1キーの押下が抑制され、-s0.25秒だけ待ちます-t 0.25readタイムアウトした場合、none 0 終了ステータスを返します。これを使用して検出でき、if特定のキーを押したときにのみ実行状態を切り替えます。

また、読み取った文字を変数に割り当てて特定の文字を確認して、1つのキーに制限することもできます。

    if read -sn 1 -t 0.25 key && [[ "$key" = "s" ]] ; then

"$key" == ""スペースや入力を確認したいときに使用してください。

読み取り+タイムアウトの副作用は、キーを押すと次のループが通常より速く実行されることです。これは、キーを押し続けるとはるかに目立つようになります。

別のアプローチは、ワークフロー制御を使用することである。ctrl + s端末を一時停止してctrl + q再起動します。これはシェル全体をブロックし、すべてのシェルでは機能しません。ctrl + zプロセスを一時停止して戻ってくるように求められたら、を使用してfgプロセスを再開すると、シェルは引き続き使用できます。

おすすめ記事