내 스크립트에서 다음 카운터 함수를 사용하고 있습니다.
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
특정 키를 누를 때만 실행 상태를 전환합니다.
또한 읽은 문자를 변수에 할당하고 특정 문자를 확인하여 하나의 키로만 제한할 수도 있습니다.
if read -sn 1 -t 0.25 key && [[ "$key" = "s" ]] ; then
"$key" == ""
공간이나 입력을 확인하고 싶을 때 사용하세요.
읽기+시간 초과의 부작용은 키를 누르면 다음 루프가 평소보다 빠르게 실행된다는 것입니다. 이는 키를 누르고 있으면 훨씬 더 눈에 띕니다.
또 다른 접근 방식은 작업 흐름 제어를 사용하는 것입니다. ctrl + s
터미널을 일시 중지했다가 ctrl + q
다시 시작합니다. 이는 전체 쉘을 차단하며 모든 쉘에서 작동하지 않습니다. ctrl + z
프로세스를 일시 중지하여 돌아오라는 메시지를 표시한 다음 를 fg
사용하여 프로세스를 다시 재개하면 셸을 계속 사용할 수 있습니다 .