Bashは出力の文字を置き換えます。

Bashは出力の文字を置き換えます。

スクリプト出力で文字を置き換える必要がありますが、最後の印刷行にはありません。出力の中央に位置します。

例えば

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

関連情報