はじめに
シェルをいじってると、ウィンドウが文字だらけになって面倒くさい。
かといって clear
で擬似的に見えなくしても、スクロールバーが豆粒みたいになって使いづらい…
と、思ってる方向け。
あとはアニメーションに使えるかも
func.sh
#! /usr/bin/env bash
clear_screen () {
local v
for v in $(seq 1 $1); do
echo -n $'\e[1A'$'\e[2K'
done
}
エラー出力とかも丸ごと消してしまうので、
プログラムがある程度完成してから使ったほうがベター
解説
下準備として、for
に使う引数をローカル変数として宣言しておき、他の変数と干渉しないようにしておきます。
- Ansi Escape Sequeces
-
$'\e[1A' とかの変なやつは、 Ansi Escape Sequences (長いので、AnsiES にする) です。カーソル移動、出力文字の消去、文字色変更、色々できます。
使った記法はたった2つです。
記法 内容 \e[nA カーソルを n
行上に移動\e[2K 行全体を消去 他の AnsiES は、下記のリンクを参照してください。
・ANSIエスケープシーケンス チートシート
これを見れば、AnsiES の記法が全て理解できます。
・bashやzshなどのターミナル上で動作するアニメーションの作り方
・bashでコマンドが無い時にやる夫が動いて煽ってくる
AnsiES を活用した、アニメーションのプログラムです。
関数の解説に戻ります。
AnsiES の力を借りたことにより、 「カーソルを1行上に移動し、行全体を削除する」を for文で制御することができました。
使用例1 指定した行数分出力を削除
test.sh
#! /usr/bin/env bash
. ./func.sh
for i in {0..9}; do
echo 'hello world' $i
done
clear_screen 4
実行結果
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
使用例2 フレームを再表示するアニメーション
dance.sh
#! /usr/bin/env bash
. ./func.sh
head=' (^o^) '
body=(
' __|__ '
'/ | \'
' __|__/'
'/ | '
'\__|__ '
' | \'
'\__|__/'
' | '
)
foot=(
' / \ '
' _\ /_ '
' / \ '
' _\ \_'
' / \ '
'_/ /_ '
' / \ '
'_/ \_'
)
echo "$head"
for i in {0..59}; do
rand_num_1=$(($RANDOM % 4))
rand_num_2=$(($RANDOM % 4))
for j in {0..1}; do
var_name=body[$(($rand_num_1 * 2 + $j))]
echo "${!var_name}"
done
for j in {0..1}; do
var_name=foot[$(($rand_num_2 * 2 + $j))]
echo "${!var_name}"
done
sleep 0.1
if [ "$input" = 'q' ]; then break; fi
clear_screen 4
done
実行結果
自分で実行した方がわかりやすいかもです。
謝礼
リンクを貼らせてもらった方々に感謝いたします。