스크립트를 동적으로 만드는 방법이 있나요? [폐쇄]

스크립트를 동적으로 만드는 방법이 있나요? [폐쇄]

타이머처럼 계속해서 다음 실행까지의 시간을 표시하려면 스크립트가 필요합니다. 가능합니까?

답변1

그것은 마치

t=1
until [ "$t" -le 0 ]
do
    t=$(($(date -d '2015-02-24 16:40:00' +'%s')-$(date +'%s')))
    sleep 1
    tput clear
    echo $t
done

답변2

몇 초마다 포크할 필요가 없도록 쉘 수학을 사용하여 많은 작업을 수행할 수 있지만 시간이 잘 유지되도록 가끔씩 일종의 동기화 장치를 사용하는 것이 좋습니다.

아래 루프는 의 초기 값을 설정한 $h다음 15초마다 값을 감소 $m시키고 $s터미널 화면의 왼쪽 상단에 카운트다운 줄을 인쇄합니다.(행 1, 열 1, \033[Home). 문제 없이 백그라운드에서 설정할 수 있지만, trap한동안 실행될 예정이라면 먼저 다른 도구를 사용하여 보호하는 것이 좋습니다.

(h=23 m=1 s=60; trap '' TTOU
until [ "$(((h-=(!(m-=!(s-=s?15:-45)*(m?1:-59))&&!s))+m+s))" -eq 0 ]
do    sleep 15
      printf "\0337\033[H\033[KT- %02d : %02d : %02d\0338" \
             "$h" "$((m?m:60))" "$((s?s:60))"
done) &

인쇄되는 선은 여기 맨 위 선과 같습니다.

T- 22 : 49 : 60 
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ % (     
h=23 m=1 s=60; trap '' TTOU

사실 아직 실행중인 걸 깜빡했는데 터미널이 스크롤이 안되면 계속 같은 곳에 그림이 계속 그려지네요..

T- 22 : 48 : 30 
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ %       
130 mikeserv@localhost ~ % (     
h=23 m=1 s=60; trap '' TTOU

그러나 터미널이 스크롤되면 다른 줄이 인쇄되기 전까지 최대 15초가 경과할 때까지 해당 줄이 화면 밖으로 스크롤됩니다. 사용된 이스케이프는 일반적으로 다음과 같이 해석됩니다.sc (커서 저장 \0337:),hr (메인 행 \033[H: ),kl (킬링라인 \033[K:)그리고rc (커서 복원 \0338:). 이들 중 하나라도 효과가 없다면 tput해당 값을 확인해야 합니다. 기본적으로는 먼저 커서 위치를 저장한 뒤 터미널 화면 상단으로 이동해 맨 윗줄을 지우고 카운트다운을 인쇄한다. 커서 위치가 복원됩니다.

감소량의 균형을 맞추는 방식으로 작동합니다.

좋다...

 h - !(m - !(s - s < 60 ? 15 : -45 ) && !s )

...더 많은 것이 있지만 이 방법은 더 작은 값이 0으로 감소할 때 더 큰 값에서 1을 뺍니다. 따라서 초 값이 1에서 0으로 감소하면 분 값도 감소합니다.둘 다분과 초는 0이고 시 값도 감소합니다.

루프가 완료되면... 아무 일도 일어나지 않습니다. 당신이 무엇을 하려는지 잘 모르겠지만, 그것이 무엇이든 거기에 넣어야 합니다 done.

거의 모든 값으로 시작할 수 있어야 하지만, 작성된 대로 $h $meconds 값은 15초 간격으로 감소할 것으로 예상됩니다.$s$s(이것은 쉽게 변경되지만). 어쨌든 이 점을 명심하시기 바랍니다.

관련 정보