スクリプト出力で文字を置き換える必要がありますが、最後の印刷行にはありません。出力の中央に位置します。
例えば
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