LoginSignup
10

More than 5 years have passed since last update.

文字を一定間隔で一文字づつ表示していく"typing"コマンドを作った

Posted at

こんな感じです。

typing.gif

Bashで動きます。

使い方

$ typing [文字列] [表示間隔(s)]

中身

typing
#!/bin/bash

if [ $# -lt 2 ]; then
    echo "Few arguments!" 1>&2
    exit 1
fi

input=$1
length=$((${#input} - 1)) # (1)
wait_time=$2

for i in `seq 0 1 $length`
do
    # input から1文字切り出し、output に結合する
    output=$output${input:$i:1} # (2)
    echo -en $output

    if [ $i -ne $length ]; then
        # カーソルを行頭に戻す
        echo -en '\r'

        # 指定した時間待機
        sleep $wait_time 
    fi
done

echo

解説

Bashには変数を処理するための便利な機能が沢山あります。
今回のスクリプトでは、算術式展開パラメータ展開を使用しています。

(1) 9行目 $((${#input} - 1))

${#変数名}と書くと、変数に格納された文字数を取得できます。(パラメータ展開)
ここでは${#input}で表示する文章の文字数を取得しています。

また、$((算術式))と書くことで、算術式の結果を得ることができます。(算術式展開)
文字配列のインデックスに使用するため、$((${#input} - 1))で上記の文字数 - 1の数値を計算しています。

(2) 14行目 ${input:$i:1}

${変数名:開始位置:長さ}で、変数に格納された文字を切り取ることができます。(パラメータ展開)
開始位置はインデックスで表されるので、0から数えます。
例えば"helloworld"という文字列が格納された変数$varに対して、"world"という文字列を切り取りたい場合は、
${var:5:5}と書きます。

ここでは、変数$inputに対して、ループ変数$iをインデックスにして、そこから1文字を切り出したいので、
${input:$i:1}としています。

使い道

なんの意味もないジョークコマンドですが、fortuneコマンドなんかと組み合わせて遊んだりできます。

typing-fortune.gif

Shellのmotdとして使うことで、厨二魂をくすぐることもできます。

motd.gif

以上です。

参考サイト

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10