カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

初心者でも分かるシェルスクリプト入門

今回は、シェルスクリプトのお話し。

シェルスクリプトって。

サーバをいじったりしてると、一日に何十回、何百回、何千回とコマンドを打つわけですが、
そのコマンドたちを組み合わせるともっと強力なことができたりします。

そして工夫すると簡単なスクリプトができあがります。んで、これってめちゃ便利なんですというのが今回のお話し。
※シェルって色々系統あったりして全然覚えきれないし、その説明が目的ではないので、シェルの定義は置いておくよ!

毎回やるの大変だった

んで、色んなことができると話題に挙げたシェルスクリプトですが、コマンドで済む場合もあるので、
必要に駆られない限り、あんま使わないのかもしれない。でも、覚えておくと便利だよって場合があって、今回そんな状況に遭遇したので、備忘録も兼ねて記しておきまする。

とある日の出来事。mysqlのベンチを取りたいと思ってsysbenchを使ってたわけですが、
スレッド数とか対象テーブルを変えるために、毎回コマンド発行するのめんどくさくなったことがあって、どうしよっかなーと思ったことがありました。

たとえば、以下のコマンドは「テストテーブルのレコード数が100万」「作成するスレッド数が4」「180秒間実行」ってことをパラメータで指定して、ベンチツールを走らせます(sysbenchに関しては覚えなくてよいっす)。

$ /usr/local/bin/sysbench --test=oltp --oltp-table-size=1000000 --num-threads=4 --max-requests=0 --max-time=180 --oltp-test-mode=complex --mysql-user=root --mysql-password=password run

こういうのって2,3回ぐらいだったらよいのですが、ベンチなので色んなパラメータを指定したくなります。「レコード数が5000万」とか「スレッド数が8」とか。
正直毎回変更するのめんどい。

こういうときにシェルの出番なう

こんな感じで毎回コマンド書きなおすのが面倒なときに、シェル使えば楽じゃんと思って、必要な部分だけ自分で入力してあとは機械にやらせようぜって感じ。

ちょっと作ってみたのが以下のスクリプト。

#!/bin/bash
echo -n "Input a sample table name : " read tname
if [ ! $tname ]; then
    echo "テーブル名を入力してください。"
    exit 1
fi
echo -n "And then, Input a sample record num : " read rows

if [ ! $rows ]; then
    echo "レコード数を入力してください。"
    exit 1
fi
echo -n "And  then, Input a thread num : " read threads

if [ ! \$threads ]; then
    exit 1
fi
rows=$rows
threads=$threads
requests=0
times=180
user=username
pass=password
table=$tname

/usr/local/bin/sysbench  --test=oltp --oltp-table-size=$rows --num-threads=$threads --max-requests=$requests --max-time=$times --oltp-dist-type=uniform --oltp-table-name=$table --mysql-user=$user --mysql-password=$pass run

sysbenchを解説する記事ではないので、ざくざく抜粋してます。 んで、説明。
なんでもそうだけど、まず宣言大事。

#!/bin/bash

単にbash使いますよということなので、これはそのままで。覚えましょう。

echo -n "Input a sample table name : "

次に画面に文字列を表示させます。そんなときはecho。

read tname

入力してねと言われたので、入力する箇所を作り出すのがこの部分。 「read 変数名」とすると、機械に早く入力しなさいよと言われます。一問一答みたいに…

んで、ここで入力された文字列が変数の値となります。

if [ ! $tname ]; then echo "テーブル名を入力してください。" exit 1 fi

次にif文。「!」でtname変数に値が入ってることを確認して値が入ってなかったら、またecho。

そして、値が入ってない場合はエラーなので、exitで終了させます。

ifの条件文で、$tnameがあるときだけ処理させたい場合は、「-n "$tname"」って感じかしらん。
このときダブルクオーテーションないとはまります。

rows=$rows
threads=$threads

そして、その変数をさらに変数へ。ここら辺もっとシンプルにできそうだけど…
誰かおせーてー!!

/usr/local/bin/sysbench --test=oltp --oltp-table-size=$rows --num-threads=$threads

あとは「\」を使って改行を無視させて、$rowや$threadsを可変のパラメータ値として渡します。

あとは実行

あとは、「/bin/sh test.sh」みたく、もしくは実行権限与えて「./test.sh」として実行させれば、各項目を聞かれるので、入力していくだけで自由にパラメータを扱えるようになります。

変数の値が入ってなさそうならechoして出力させればよいし、デバッグもまだしやすいほうじゃないかしらん。

終わりに

こういうの組んで自分で実行してみると、
使っててやっぱ便利だなー、毎回クイズに答えてるみたいで楽しいなーと思えてきて、毎回コマンド実行はさすがに無理だなと思って来ちゃいます。
ということで、シェルスクリプトについて自分なりに説明してみました。

ひとまずこういう変数とか条件文を組み合わせて、他の色んなコマンドも組み合わせていけば一気に色んなことやってくれるし、
使い方次第なのがシェルスクリプトなのかなぁと思ってます。

アウトプット頑張るよってことで今日も書いた!!
間違ってる部分あったら指摘お願いします!