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키 누르기를 억제 -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사용하여 프로세스를 다시 재개하면 셸을 계속 사용할 수 있습니다 .

관련 정보