私のスクリプトでは、次のカウンタ関数を使用しています。
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
キーの押下が抑制され、-s
0.25秒だけ待ちます-t 0.25
。read
タイムアウトした場合、none 0 終了ステータスを返します。これを使用して検出でき、if
特定のキーを押したときにのみ実行状態を切り替えます。
また、読み取った文字を変数に割り当てて特定の文字を確認して、1つのキーに制限することもできます。
if read -sn 1 -t 0.25 key && [[ "$key" = "s" ]] ; then
"$key" == ""
スペースや入力を確認したいときに使用してください。
読み取り+タイムアウトの副作用は、キーを押すと次のループが通常より速く実行されることです。これは、キーを押し続けるとはるかに目立つようになります。
別のアプローチは、ワークフロー制御を使用することである。ctrl + s
端末を一時停止してctrl + q
再起動します。これはシェル全体をブロックし、すべてのシェルでは機能しません。ctrl + z
プロセスを一時停止して戻ってくるように求められたら、を使用してfg
プロセスを再開すると、シェルは引き続き使用できます。