Bash - スクリプトでカーソル位置移動!

Updated:


Bash スクリプトで文字を出力する際に位置を指定したいことがあります。

terminfo データベースを使ってターミナル・セッションの初期化と操作を行うことのできる tput コマンドコマンドを使用することで、実現可能です。

以下、それについての備忘録です。

0. 前提条件

  • Linux Mint 17.1(64bit), CentOS 6.6, 7.0 で動作確認済み。
  • Bash 4.3.11(Mint), 4.1.2(CentOS 6.6), 4.2.45(CentOS 7.0 で動作確認済み。
  • tput コマンドの詳細については man tput 等を参照。

1. 例ー1

1-1. Bash スクリプト作成

3つの例を1つのシェルファイル内に記載している。

その他の注目事項。

  • echo -n は文字列出力後開業しない。
  • tput cub 19 はカーソル位置を19桁左に移動。
  • tput cuu 1 はカーソル位置を1行上に移動。
  • printf での \r は CR(キャリッジリターン(復帰)、 \n は LF(ラインフィード(改行)。

File: test_bash_cursor_1.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash

# 1. 指定文字数左へ移動後に echo
#    ( 最後の echo 以外は改行しない )
#
echo -n `date +"%Y-%m-%d %H:%M:%S"`
for i in {0..4};
do
  sleep 1
  tput cub 19
  echo -n `date +"%Y-%m-%d %H:%M:%S"`
done;
tput cub 19
echo `date +"%Y-%m-%d %H:%M:%S"`
echo "-------------------"

# 2. 指定行数上へ移動後に echo
#    ( 毎回改行 )
#
echo `date +"%Y-%m-%d %H:%M:%S"`
for i in {0..4};
do
  sleep 1
  tput cuu 1
  echo `date +"%Y-%m-%d %H:%M:%S"`
done;
tput cuu 1
echo `date +"%Y-%m-%d %H:%M:%S"`
echo "-------------------"

# 3. 行の先頭へ復帰(CR(\r))後 printf
#    ( 最後の echo 以外は改行しない )
#
printf "%10s %8s" `date +"%Y-%m-%d %H:%M:%S"`
for i in {0..4};
do
  sleep 1
  printf "\r%10s %8s" `date +"%Y-%m-%d %H:%M:%S"`
done;
printf "\n"

1-2. Bash スクリプト実行

3種類とも、改行されずに日時が出力される。

$ ./test_bash_cursor_1.sh
2014-12-14 00:46:37
-------------------
2014-12-14 00:46:42
-------------------
2014-12-14 00:46:47

2. 例ー2

2-1. Bash スクリプト作成

スクリーンをクリア後、枠を作成してその中に日時を出力する例。

その他の注目事項。

  • tput clear で画面クリア。
  • tput setb 1 で背景色を青に設定。
  • tput setf 6 で文字色を黄に設定。
  • tput bold でフォントを太字に設定。
  • tput cup 2 4 でカーソルを3行目・5桁目に移動。
  • tput cud 2 でカーソルを3行下に移動。
  • tput init で設定を初期化。

File: test_bash_cursor_2.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# Clear the screen
tput clear

# Write a frame
echo
echo "  +---------------------+"
echo "  |                     |"
echo "  +---------------------+"
echo

# Set font
tput setb 1
tput setf 6
tput bold

# Output date and time
for i in {0..4};
do
  sleep 1
  tput cup 2 4
  echo -n `date +"%Y-%m-%d %H:%M:%S"`
done;
tput cup 2 4
echo -n `date +"%Y-%m-%d %H:%M:%S"`

# Move the cursor position
tput cud 2
echo

# Reset tput setting
tput init

2-2. Bash スクリプト実行

画面クリア後に枠が出力され、その中に色付き太字で日時が表示される。(以下はハードコピーではないので、色付きでも太字でもない)


  +---------------------+
  | 2014-12-14 00:49:26 |
  +---------------------+

3. 参考サイト


いつか必要になることがあるかも知れない Tips でした。

以上。





 

Sponsored Link

 

Comments