シェルスクリプト 入門 研修コースに参加してみた

参加した研修コースは シェルスクリプト入門 です。
全く違う文脈ですが、 RPA など定型業務の自動化が改めて注目を浴びています。このコースに参加してみて、シェルスクリプトは IT エンジニアにとっての RPA を実現する道具なんだなぁ、と思いました。(雑な感想スイマセン)
参加してみると、シェルスクリプトが動く仕組みは、ほどほどに、実際に書きながら、その書き方に馴染んでいきながら、最終的には IP アドレスの死活確認を行うプログラムが読めるようになりました! (書けるようになるには何回も書かねば…)
この業界では「同じ操作を二度繰り返したら自動化」という言葉が定着するぐらいなので、インフラに限らず、これから IT エンジニアとして業務につかれる方には、とてもオススメのコースです!
では、どんなコースだったのか、レポートします!!
もくじ
コース情報
想定している受講者 | Linux の基本操作(テキストファイル作成、コマンド操作)ができること |
---|---|
受講目標 |
|
講師紹介
前回のレポート に続き、これからインフラ系コースのレポートではお馴染みになる 新谷 泰英さん です。

どうすれば技術を身につけられるか、理解できるか、研究しつづけるインフラ系の人気トレーナー
ちなみに、自己紹介ではいつもお名前だけしか言わずに、ササッとコースをスタートされます。
シェルスクリプトとは?
まずはシェルスクリプトとは何か、というお話です。
- シェル上で実行可能な簡易プログラム
- プログラミングができるということと同義
- 書き方に癖がある
- シェルとは?
- カーネル Kernel 機能
- シェル shell 操作/UI -> Kernel に命令するプログラム
- 人間がコマンド実行するのか、プログラムがコマンド実行するのかの違い
- shell と shell script は違う.. Java と JavaScript ぐらい違う?
- ( NG な表現) 「shell で書いておいたから」
- 定型作業の自動化によく使う
- 実行したいコマンドを並べて実行していくだけ
- 条件分岐や繰り返しも使える (!!)
シェルとシェルスクリプトの種類
- シェルにも種類がある
- ブラウザソフトの違いのようなもの
- Linux では bash が標準シェルとしてよく使われている
- MACでも同じ
- WindowsでもWSL (Windows Subsystem for Linux) を有効化すると使える
- sh (Bourne shell, bシェル)から発展して bash csh zsh などがある
- csh はC言語っぽい書き味
- bシェルはどこでも動く
- 今日は bash だけど bシェル に近いものを書く
- 一度動いたシェルプログラムはどのシェルでも動く
私も WSL で bash 使ってます!! シェルプログラムは書いたことはありません! 何度も同じコマンドを打ってます!! ちなみに、エイリアスも設定してないレベルです!!! (浅い…)
実行
ここからは早速、シェルスクリプトでプログラムを書いていきます。
- sample1.sh ファイルを作成
vi sample1.sh
- 作成したファイルにプログラムを書く
# シバン (シェバン) からスクリプトを実行するインタープリタが呼ばれ `/bin/sh` のファイルが実行される
#!/bin/sh
echo 'Hello, World!!'
echo $$ # $$は変数でプロセスID
- 実行する
- 別シェルで実行する
$ sh sample.sh
- 今のシェルで実行する
$ . sample.sh
$ source sample.sh
- シェル変数で実行する
- カレントディレクトリにファイルがある場合、ファイル名でOK
$ ./sample1.sh
- 実行権限を設定
$ chomd +x sample1.sh
- 別シェルで実行する
- 実際どこで実行されているか確かめてみる
- sample1.sh に
$ echo $$
を加える
- sample1.sh に
確かに違いますね!
コメントの書き方
コメント #
の入れ方に注意です。
$ echo $USER #ログインユーザー名を表示
$ echo "#login user#"
ユーザー名と文字列が表示されますね
リダイレクトを使ってみる
$ cat error.txt 2> /dev/null #/dev/null に入れると破棄される。なお 2> は条件分岐してエラーが起こった場合の岐路
実行してみるとファイルがなくなっていました!
繰り返し処理 for の書き方
ここからはプログラムらしいものになってきます。
- 繰り返し処理は順次実行を繰り返したもの
- 順次実行を繰り返して書けばよい
- 回数制御できない
- ファイルが重くなる
#for の後に条件を書く
$ for i in 1 2 3 4 5 #iという変数に1, 2, ... 5 を代入
#do と done の間に書いた処理が繰り返される
> do
> #ここに処理を書く。なお、インデントは入れると見やすい
> done
# ワンライナーという書き方もある
#! /bin/sh
$ for i in 1 2 3 4 5;do echo "$i回目";done #;で改行
ワンライナー。。素人が最も読めないやつです。が、これなら読めますぜ !! (うれしい)
ちょっとスマートに改良
今の書き方だと n 回目の n まですべて書かねばならない… 変えましょう
for i in `seq 1 10` #seq は sequential
do
echo "$i回目"
done
``
について`コマンド`
古い書き方$ echo `whoami`
$(コマンド)
いまの書き方$ echo $(whoami)
`seq 1 10`
を{1 10}
とも書ける
応用してみる
設定ファイル (*.conf) の名前をすべて出力
$ for filename in `ls /etc/*.conf`
> do
> echo $filename
> done
変数の書き方
変数の書き方です。が、自由すぎるとの新谷さんのコメント。 なおシェル毎に変数を作れます。
$ name="SEカレッジ"
$ echo $name
めっちゃ自由やん。。
実務で変数を使う
# DATE=$(date)
root# DATE=$(date)
root# echo $DATE
2018年 10月 10日 水曜日 16:25:23 DST
例えば、これで日付ごとにフォルダやファイルを作ったりするとのことでした。便利ですね。
条件分岐
- 真偽値の扱い
- true 0 は成立
- false 0以外 は不成立
- エラー処理を表現することが多いので 0以外
$ echo $?
?
は実行結果の変数
- 真偽判定には test コマンドを使う
$ test -e /etc/passwd #etc に passwd があるか
$ echo $?
0
$ test -e /etc/passwdddddd
$ echo $?
1
[ ]
もよく使われる ->[ -e /etc/passwdddddd ]
このあたりをやり始めると、やはり演算子や正規表現をちゃんと覚えておかねば、という気持ちになります。
if の書き方
- if then else を使う
if (条件 testコマンドなど)
then
(成立 0)
else
(不成立 1)
fi #ifの終了を表す
実務的なプログラム
ここまでの内容を全部使ったサンプルをもとに ping の死活確認を自動化するプログラムを書いてみましょう。
#!/bin/sh
ipbase=192.168.250 #ipbaseという変数を定義
for i in `seq 1 10` #iに1から10まで代入
do
target=${ipbase}.${i} #192.168.250.1~10 までをtargetという変数につど代入
ping -c 1 $target > /dev/null #pingで疎通確認
if [ $? -eq 0 ] #0 が equal かどうか判定
then
echo "{$target}は稼働中です。" #正常メッセージの出力
else
echo "{$target}は停止しています。" #エラーメッセージの出力
fi
done
本当にこれまで習った構文で読めますね! いえい!
最後、実際に IP のところを変えて、このコードを実行してみたところでコースは修了しました。
まとめ
このコースではシェルスクリプトが動く仕組みを学んで、実際にシェルスクリプトの基本構文を書きながら、最後は実務的なプログラムを実行してみました。
シェルスクリプトをはじめ、やはりサッと書いて実行結果がすぐにわかると、とても理解が進みますね。
現在の DevOps という文脈ではプログラムでインフラを管理するようになっています。インフラエンジニアだけど、そろそろプログラミングやっておくか、という方にはとても学習コストの低いものだったので、とっかかりとして、とてもオススメです !!

SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。