インフラエンジニアのため、構築や運用等で使用するシェルスクリプトを作成するようになりました。
シェルスクリプトの作成は初めてのため、業務中に学習したことを記載します。
シェルスクリプトとは
Linux OSのコマンドを上から順に実施するスクリプトです。
普段ならMacのターミナルやWindowsのTeraTermでLinuxのコマンドを手動で実行しますが、
.shファイルにコマンドを記載し、そのファイルを実行することで.shファイルに記載されていることが実行されます。
bash, sh, csh, zshで書き方が少し異なります。
使用シェルを定義する
シェルスクリプトでは、ファイルの頭に以下のような記載をします
#!/bin/bash
こちらの意味は使用するシェルの場所を指定してます。
使用できるシェルはcat /etc/shells
で確認できます
$ cat /etc/shells
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
私のMacbookでは上記シェルが使用できるようです
実行方法
まずファイルに実行権限を付与します
$ chmod 755 test.sh
実行方法は以下になります
$ ./test.sh
権限が足らないと以下のようにはじかれます。
$ ./test.sh
zsh: permission denied: ./test.sh
confファイル内の変数を読み込む
サーバ名はドメイン名などの固有情報を.shファイルに記載したくない場合、confファイルに
記載し、.shファイル内で読み込むことでconfファイルに記載している変数を読み込むことができます。
例として以下のように記載します
USER="testuser"
SERVER="xxx.xxx.xx.xx"
#!/bin/bash
. test.conf
echo ${USER}
echo ${SERVER}
以下で実行結果です。
$ ./test.sh
testuser
xxx.xxx.xx.xx
confファイルに定義した内容がechoで表示されました。
if文
条件で処理を分岐させます。
if [ 条件式 ]; then
処理内容
fi
if文は、ifで始まり、fiで終わります。
比較演算子では以下のようになります。
- 数値の比較
数値の比較は以下になります()の部分は個人的な覚え方です(あっているかどうかは)
比較演算子 | 内容 |
---|---|
数値1 -eq 数値2 | 数値1と数値2が等しい(equal)場合True |
数値1 -ne 数値2 | 数値1と数値2が等しくない(not equal)場合True |
数値1 -gt 数値2 | 数値1が数値2より大きい(greater than)場合True |
数値1 -ge 数値2 | 数値1が数値2以上(greater equal)の場合True |
数値1 -lt 数値2 | 数値1が数値2より小さい(little than)の場合True |
数値1 -le 数値2 | 数値1が数値2以下(little equal)の場合True |
- 文字列の比較
文字列の比較は以下になります。
比較演算子 | 内容 |
---|---|
文字列1 = 文字列2 | 文字列1と文字列2が等しい場合True |
文字列1 != 文字列2 | 数値1と数値2が等しくない場合True |
-n 文字列 | 文字列の長さが1以上の場合True |
-z 文字列 | 文字列の長さが0の場合True |
また、if文のつなげたい場合はelifで繋げることができる
if [ 条件式1 ];than
内容1
elif [ 条件式2 ]; than
内容2
else
内容3
if
上記の場合、条件式1を満たす場合、内容1、
条件式2を満たす場合、内容2、
どれも満たさない場合、内容3が実行されます。
for文
繰り返し実行するものはfor文を使用します
for 変数名 in リスト名
do
処理内容
done
以下実行例です
#!/bin/bash
for FRUIT in apple banana cherry
do
echo ${FRUIT}
done
実行結果は以下
$ ./test.sh
apple
banana
cherry
最後に
シェルスクリプトで運用スクリプトを作成するときは、
対象ログや標準出力等に表示するようにリダイレクトや、
awkなどを使用してこのファイルのこの部分を取得して変数に入れるなどの処理が多いと思います。
Linuxコマンドに詳しくなると幅広いシェルスクリプトが書けるようになると思うので、
特にインフラエンジニアでコードを書いたことがない人は、
シェルスクリプトとLinuxコマンドの学習が必要と感じました。
参考文献