스크립트 출력에서 문자를 바꿔야 하는데 마지막 인쇄된 줄에 없습니다. 출력 중간에 위치합니다.
예를 들어
XX----------------------------------------------------------XX
|XXX |XXX
| XX | XXX
| XX------------------------------------------------------+-----XXX
| | +
| | +----------------------------------------------------+ |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | 12:34:56 <------+ Characters to replace! |
| | | | |
| | | <--------------------------+ | |
| | | | |
| | | | |
| | | | |
+XX--+ | | |
XX | +----------------------------------------------------+ |
XXX |
+--------------------------------------------------------------+
암호:
#!/bin/bash
function printThing(){
local timeVar=$(date +"%T")
local lines=(
' XX----------------------------------------------------------XX'
' |XXX |XXX'
' | XX | XXX'
' | XX------------------------------------------------------+-----XXX'
' | | +'
' | | +----------------------------------------------------+ |'
' | | | | |'
' | | | | |'
' | | | | |'
' | | | | |'
' | | | | |'
" | | | $timeVar <------+ Characters to replace! |"
' | | | | |'
' | | | <--------------------------+ | |'
' | | | | |'
' | | | | |'
' | | | | |'
' +XX--+ | | |'
' XX | +----------------------------------------------------+ |'
' XXX |'
' +--------------------------------------------------------------+' )
for i in "${lines[@]}"
do
echo "$i"
done
while :
do
local timeVar=$(date +"%T")
#Replace the time in the strings printed above
sleep 1
done
}
printThing
전체 레이아웃을 엉망으로 만들지 않고 어떻게 시간 값을 바꿀 수 있나요?
답변1
설치한 경우 명령을 사용하여 인쇄 명령을 사용할 수 있는 터미널의 어딘가로 커서를 이동할 ncurses
수 있습니다 .tput
예:
clear
for i in $(seq 1 40)
do
echo '## ##'
done
for i in $(seq 1 100)
do
tput cup 20 5
date
sleep 1
done
그러나 기능을 종료하기 전에 커서를 안전한 위치로 이동하는 것이 좋습니다. 예를 들어
tput cup $(tput lines) 0
그러면 터미널의 마지막 줄로 이동됩니다.
답변2
이를 지원하는 터미널의 경우 다음을 사용할 수 있습니다.커서 저장그리고커서 복원이스케이프 시퀀스:
#! /bin/sh -
save_cursor=$(tput sc) restore_cursor=$(tput rc)
text="\
XX----------------------------------------------------------XX
|XXX |XXX
| XX | XXX
| XX------------------------------------------------------+-----XXX
| | +
| | +----------------------------------------------------+ |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | $save_cursor$(date +%T) <------+ Characters to replace! |
| | | | |
| | | <--------------------------+ | |
| | | | |
| | | | |
| | | | |
+XX--+ | | |
XX | +----------------------------------------------------+ |
XXX |
+--------------------------------------------------------------+"
printf '%s\n' "$text"
while sleep 1; do
printf %s "$restore_cursor$(date +%T)"
done
답변3
어쩌면 다음과 같은 방법으로 문제가 해결될 수도 있습니다.
#!/bin/bash
function printThing(){
local timeVar=$(date +"%T")
local lines="\
XX----------------------------------------------------------XX
|XXX |XXX
| XX | XXX
| XX------------------------------------------------------+-----XXX
| | +
| | +----------------------------------------------------+ |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | $timeVar | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
+XX--+ | | |
XX | +----------------------------------------------------+ |
XXX |
+--------------------------------------------------------------+"
for i in "${lines[@]}"
do
echo "$i"
done
}
printf "\033c"
while :
do
timeVar=$(date +"%T")
printThing
sleep 1
printf "\033c"
done