ShellScript
Bash

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

こんな感じです。

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

以上です。

参考サイト