Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@s4kr4

文字を一定間隔で一文字づつ表示していく"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

以上です。

参考サイト

10
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What is going on with this article?