Bash를 통해 종료 시간을 제공하는 터미널 타이머

Bash를 통해 종료 시간을 제공하는 터미널 타이머

그래서 hh:mm:ss(24시간 형식)로 시간을 받아 그 시간까지 타이머를 만들어주는 bash 함수를 만들어볼까 생각했습니다.

남은 시간을 알려주는 일회성 알람 시계와 비슷합니다.

watch이 작업을 수행하기 위해 명령을 사용할 생각입니다

이 작업을 수행하는 방법에 대해 몇 가지 질문이 있습니다.

먼저, bash를 사용하여 특정 시간 이전에 남은 금액을 어떻게 알 수 있나요?

그렇다면 화면에 다시 표시되도록 사람이 읽을 수 있는 형식으로 어떻게 변환합니까?

또한 과거나 미래의 다른 날에 어떻게 이 작업을 수행할 수 있습니까?

이 기능을 만드는 데 도움을 주시면 모든 사람이 사용할 수 있도록 최종 결과를 여기에 게시하겠습니다.

편집: 나는 이것을 얻을 수 있었습니다협회게시자: @terdon

timer () 
{ 
    start="$(date +%s -d $1)";
    while [ "$start" -ge $(date +%s) ]; do
        days="$(($(($(( $start - $(date +%s) )) * 1 )) / 86400))";
        time="$(( $start - `date +%s` ))";
        if [ $days -gt 0 ]; then
            printf '%s day(s) and %s\r' "$days" "$(date -u -d "@$time" +%H:%M:%S)";
        else
            printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)";
        fi;
        sleep 0.1;
    done
}

모든 인수가 따옴표 안에 있음에도 불구하고 date -d $1이 여러 단어 인수를 허용할 수 없는 문제에 직면했습니다. 저는 우분투를 사용하고 있고 bash를 사용하고 있습니다. 이것이 테스트를 위해 실행한 코드입니다. 보시다시피 따옴표가 없는 첫 번째 단어 뒤에 오는 내용을 무시하고 따옴표가 있으면 오류가 발생합니다.

$ timer 17:25
00:04:37
$ timer sun
1 day(s) and 06:39:31
$ timer sun 17:25
1 day(s) and 06:39:20
$ timer sun 22:25
1 day(s) and 06:39:09
$ timer "sun 22:25"
date: extra operand ‘22:25’
Try 'date --help' for more information.
bash: [: : integer expression expected

답변1

-d 옵션을 사용할 때 date 명령에 여러 단어 인수를 전달하는 데 문제가 있는 것 같습니다. 이 문제를 해결하려면 IFS(내부 필드 구분자) 변수를 사용하여 인수를 구문 분석할 때 셸에서 사용하는 구분 기호를 임시로 변경할 수 있습니다. 다음은 여러 단어 인수를 처리하도록 함수를 수정하는 방법에 대한 예입니다.

timer () 
{ 
    IFS=":" read -ra time_parts <<< "$1"
    time_str=""
    for part in "${time_parts[@]}"; do
        time_str+=" $part"
    done
    start="$(date +%s -d "$time_str")";
    while [ "$start" -ge $(date +%s) ]; do
        days="$(($(($(( $start - $(date +%s) )) * 1 )) / 86400))";
        time="$(( $start - `date +%s` ))";
        if [ $days -gt 0 ]; then
            printf '%s day(s) and %s\r' "$days" "$(date -u -d "@$time" +%H:%M:%S)";
        else
            printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)";
        fi;
        sleep 0.1;
    done
}

이를 통해 "sun 22:25"와 같은 여러 단어 인수를 함수에 전달하고 date 명령이 이를 올바르게 구문 분석하도록 할 수 있습니다.

질문하신 다른 질문에 대해서는 date -d 명령을 사용하여 특정 시간까지 남은 시간을 확인한 후 다음 명령을 사용할 수 있습니다.

날짜 -u -d "@$time" +%H:%M:%S

사람이 읽을 수 있는 형식으로 변환합니다.

과거나 미래의 다른 날에 추가하고 싶다면 날짜를 추가할 수도 있습니다.

날짜 -u -d "2022-12-25 22:25" +%s

그러면 제공한 날짜와 시간에 대한 타임스탬프가 제공됩니다.

관련 정보