エンジニアの仕事はプログラムを書くことだけではない。
サーバに入ってプロセスが正常に動いているか確認したり、環境構築を整えるためにCUIでコマンドを実行しながらすすめることもある。
この時に我々がやっていることはとどのつまり、「OSに対して命令を行っている」だ。
例えば、何気なく頻繁に打っている下のコマンド
1 2 |
$ ls ~/ work project Downloads Desctop |
これはOSに「ホームディレクトリ配下にあるファイルやフォルダを出力して」という命令をしている。
これらの命令を自動化し、都度コマンドを打たなくてもサーバが勝手に動いてくれるようにできれば
日々のOS操作の業務がもっとシンプルになる。
シェルスクリプトはそれを実現する手段である。
・・・・
偉そうなセリフ言うの疲れたw ていうわけで、ぼちぼちシェルスクリプトの記事をまとめていくので。知っとけばエンジニアとしてのスキルアップにつながるのは間違いないんだけど、情報源すくないよねw だから、俺がまとめるよ
目次
とりあえず”Hello World!”を出力
ほとんどのプログラム言語でも”Hello World!”からはじまるので、シェルスクリプトでもそれをやる。
次のファイルを作成してほしい
hello-world.sh
1 2 3 |
#!/bin/sh echo "Hello World!" |
作成したら、下のコマンドで実行「Hello World!」と出力されれば成功
1 2 |
$ sh hello-world.sh Hello World! |
これがシェルスクリプトの原点だ。
ターミナル上で打っている
1 |
$ echo "Hello World!" |
を.shの拡張子のファイルに記述し、それをshコマンドで呼び出して実行しているだけ。
と考えればシンプル。
複数のコマンドを実行
先程の例ではechoコマンドで文字列を出力するだけであったけど、もちろん複数のコマンドを記述して、それを順番通りに実行することも可能
次のファイルを作成してほしい
make-files.sh
1 2 3 4 5 6 7 |
#!/bin/sh mkdir -p dir1/subdir1-1 dir1/subdir1-2 mkdir -p dir2/subdir2-1 dir2/subdir2-2 touch dir1/subdir1-1/file.txt dir1/subdir1-2/file.txt touch dir2/subdir2-1/file.txt dir2/subdir2-2/file.txt |
ディレクトリを作成して、そのディレクトリ内にファイルを作成するというコマンド。
このように複数行のコマンドを一つのファイルに記述していれば、実行する時には下の一行で済む。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ sh make-files.sh $ tree ├── dir1 │ ├── subdir1-1 │ │ └── file.txt │ └── subdir1-2 │ └── file.txt ├── dir2 │ ├── subdir2-1 │ │ └── file.txt │ └── subdir2-2 │ └── file.txt ├── hello-world.sh └── make-files.sh |
コマンドの数が多ければ多いほど、それを打ち間違えることも多くなるし、
それをシステムを運用する上で何回も実行する必要が出れば、人的ミスを出て障害が起きることだってある。
スクリプトファイルにそれを一度記述してしまえば、そのプラグラムを実行するだけでいいので、こうしたミスは減る。
これがシステム運用に関わったエンジニアから見る、シェルスクリプトが使えるメリットだな。
SSHに入ってデプロイするコマンドサンプル
Gitで本番ブランチを最新にしたあと、本番システムにそれを反映させるためには実際にサーバに入って、git pullで最新のブランチを引っ張って、npmとか何やらでパッケージを最新にしてなどの作業が必要になる。これが結構センシティブな作業で、ミスったり中途半端に終わらせたりしてると最悪システムが止まったりなりかねない。
なので、こういったものほど作業をスクリプトファイルにまとめた方が絶対良い
ssh-deploy.sh
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/sh ssh target-server <<EOC cd /var/www/project git checkout -f master git pull npm i npm run dev composer install php artisan db:seed php artisan migrate EOC |
内容から、「あ、Laravelのプロジェクトのデプロイやな」ってのが伝わると思う。
こういうスクリプトをGitlabのCIとかで自動で実行できるようになれば開発はもっと気持ちいいものになるよ。
それでは、またの
まとめ
- シェルスクリプトはOSに対する命令である。
- スクリプトファイルにコマンドの一連を記述しておけば、ファイルを実行するだけで済み、入力ミスが無くなる
- サーバに入って、デプロイなどのセンシティブな作業はスクリプトファイルにまとめて実行すべき(できれば自動で